私はそれを学ぶために遊んでい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