私はそれを学ぶために遊んでいArray#[]
ました。IRB
私のすべての試みは以下の通りです:
以下のコードが理解されます。
[2,3][0..1]
#=> [2, 3]
なぜ以下のコードが与えるのempty array
ですか?
[2,3][-1,0]
#=> []
しかし、なぜコードがnil
価値を与えるのでしょうか?
[2,3][0,-1]
#=> nil
[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