2010年12月23日

[ruby-list:47708] Re: Array#values_at behavior

kouya です。

返信ありがとうございます。

2010年12月23日14:29 Nobuhiro IMAI <nov@xxxxx>:
>
>> ですので、説明を書くならば、
>> 「セレクターにRange オブジェクトを渡した場合、begin が範囲外の場合はその範囲は無視されます。

>> end が範囲外ならば、nil が代入され、それ以降の範囲は無視します。」
>> といったかんじでしょうか。
>
> 2文目は、
>
> 「Range の途中で配列の範囲外になると nil を代入?して、それ以降の範囲は
> 無視します。」
>

はい、それで大丈夫だと思います。
と思ったら、

[kouya@xxxxx 17:18:14 ~]$ ruby-19-trunk -ve 'p [1,2,3].values_at(0..3)'
ruby 1.9.3dev (2010-11-07 trunk 29711) [x86_64-darwin10.4.3]
[1, 2, 3, nil]
# ここで最後にnil が入るのはselector の 3 が範囲外なのでOK

[kouya@xxxxx 17:18:25 ~]$ ruby-19-trunk -ve 'p [1,2,3].values_at(3..5)'
ruby 1.9.3dev (2010-11-07 trunk 29711) [x86_64-darwin10.4.3]
[nil]
# selector の3 は範囲外であるが、処理を行わないのではなく nil がはいっている。

[kouya@xxxxx 17:18:47 ~]$ ruby-19-trunk -ve 'p [1,2,3].values_at(4..5)'
ruby 1.9.3dev (2010-11-07 trunk 29711) [x86_64-darwin10.4.3]
[]
# selector の4 は範囲外であり処理を行わない。

というわけで、ここでいう範囲外というのは
「selector が配列の長さを超えたら(配列の長さが3だった場合は4、といったように)」
ということなのかもしれません。

ためしに、ソースコードの中にあるtest/ruby/test_array.rbをのぞいてみたんですけど
「範囲外」に関する追加情報は書いてなかったです。うーむ。

def test_values_at
a = @cls[*('a'..'j').to_a]
assert_equal(@cls['a', 'c', 'e'], a.values_at(0, 2, 4))
assert_equal(@cls['j', 'h', 'f'], a.values_at(-1, -3, -5))
assert_equal(@cls['h', nil, 'a'], a.values_at(-3, 99, 0))
end

def test_values_at2
a = [0, 1, 2, 3, 4, 5]
assert_equal([1, 2, 3], a.values_at(1..3))
assert_equal([], a.values_at(7..8))
assert_equal([nil], a.values_at(2**31-1))
end


--
kouya


投稿者 xml-rpc : 2010年12月23日 17:46
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/100918
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。