0

重複の可能性:
Ruby での配列のスライス: 非論理的な動作の説明を探しています (Rubykoans.com から取得)

私は単純な配列オブジェクトを持っています:

array = [:peanut, :butter, :and, :jelly]

その長さは、明らかに 4 です。

次に、これらのステートメントを見てください。

array[4,0] == []
array[5,0] == nil

配列を 4 番目のインデックスからスライスすると空の配列が返されますが、5 番目の要素から始まると nil が返されます。なぜこれが起こるのですか?

4

3 に答える 3

1

実際、あなたが「奇妙」だと思った理由は、常にソースコードにあるはずです。https://github.com/ruby/ruby/blob/trunk/range.cから関連するスニペットを選択するだけです

...
if (beg < 0) {
beg += len;
if (beg < 0)
    goto out_of_range;
}
if (err == 0 || err == 2) {
if (beg > len)
    goto out_of_range;
if (end > len)
    end = len;
}
...

ここで、開始インデックスbegが-lengthより小さい場合、範囲外に戻りますQnil。それ以外の場合、開始インデックスが配列の長さ(lenコードスニペット内)よりも大きい場合は、範囲外(Qnil)も返します。ここで注意してください、それは大きくないか等しいか、それがあなたが得る理由です[]array[4,0]4は範囲外ですが)nilarray[5,0]

于 2012-04-15T13:30:01.160 に答える
1

slice(start, length)( にアクセスしたときに呼び出されるメソッド) は、 index から始まるarray[]長さの配列を返します。これは、 returnの理由を説明しています。lengthstartarray[4,0][]

ただし、この方法にはまれなケースがあります。スライスの Ruby ドキュメントには次のように書かれています。

インデックス (または開始インデックス) が範囲外の場合は nil を返します。

2番目の例で5は、 の範囲外ですarray。これにより、メソッドは を返しnilます。

于 2012-04-15T12:50:54.997 に答える
1

一瞬、バグを見つけたかと思いましたが、この動作を説明できると思います。指定した開始インデックスは、そのインデックスの要素の直前sliceと見なされます。したがって、 indexは配列の最後( indexの直前、 index の直後)と見なされます。次の例は、それを明確にする必要があります。443

> [1,2,3,4][0, 3]
 # => [1, 2, 3] 
> [1,2,3,4][1, 3]
 # => [2, 3, 4] 
> [1,2,3,4][2, 3]
 # => [3, 4] 
> [1,2,3,4][3, 3]
 # => [4] 
> [1,2,3,4][4, 3]
 # => [] 
> [1,2,3,4][5, 3]
 # => nil 
于 2012-04-15T13:16:35.843 に答える