0

私はそれを学ぶために遊んでいArray#[]ました。IRB私のすべての試みは以下の通りです:

以下のコードが理解されます。

[2,3][0..1]
#=> [2, 3]

なぜ以下のコードが与えるのempty arrayですか?

[2,3][-1,0]
#=> []

しかし、なぜコードがnil価値を与えるのでしょうか?

[2,3][0,-1]
#=> nil
4

1 に答える 1

3

[2,3][1,2]インデックス1から開始し、次の2つの値を選択します。

[2,3][-1,0]インデックス-1から開始し、次の0の値を選択します。-1は配列の最後から始まり、逆方向に機能します。

編集:

更新された質問に答えるには[2,3][0,-1]、インデックス0から開始しますが、長さに負の数を指定することはできないため、を返しnilます。

インデックスの前の値を選択する場合は、インデックスを1減らし、長さを1にします。

EDIT2:

Rubyは、負の長さの値を受け入れるようには設計されていませんが、負の開始値を受け入れるように設計されています。

また、ドキュメントでは、「さらに、要素範囲の開始インデックスが配列の最後にある場合、空の配列が返されます。」-http ://www.ruby-doc.org/core-2.0/Array.html#method-i-5B-5D

Rubyソースコードをドリルダウンした後、開始インデックス値または長さ値のいずれかがゼロ未満の場合、rb_ary_subseq関数は戻ります。nil

ただし、rb_ary_subseqが呼び出される前に、rb_ary_aref関数は負の開始インデックス値を正のwithに変更start += array.lengthして、同じ効果を与えます。

負の長さを変換するコードはありません。

したがって[2,3][-1,0]、長さがゼロ以上であり、参照されているドキュメントの説明があるため、空の配列が返されます。

[2,3][0,-1]nil長さがゼロ未満であるため、戻ります。

ソースコードリンク:

rb_ary_aref-http ://rxr.whitequark.org/mri/source/array.c#1042

rb_ary_subseq-http ://rxr.whitequark.org/mri/source/array.c#989

于 2013-03-25T17:08:42.523 に答える