From: Kouya Date: 2010-12-23T17:46:54+09:00 Subject: [ruby-list:47708] Re: Array#values_at behavior kouya です。 返信ありがとうございます。 2010年12月23日14:29 Nobuhiro IMAI : > >> ですので、説明を書くならば、 >> 「セレクターにRange オブジェクトを渡した場合、begin が範囲外の場合はその範囲は無視されます。 >> end が範囲外ならば、nil が代入され、それ以降の範囲は無視します。」 >> といったかんじでしょうか。 > > 2文目は、 > > 「Range の途中で配列の範囲外になると nil を代入?して、それ以降の範囲は > 無視します。」 > はい、それで大丈夫だと思います。 と思ったら、 [kouya@kmba01 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@kmba01 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@kmba01 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