📑
[Bug #20957] Array#values_at に負のRangeを渡したときの挙動に関するチケット
[Bug #20957] RangeError on Array#values_at with negative ranges
-
Array#values_at
は引数で指定されたインデックスに対応する要素を配列で返すメソッド - Array#values_at (Ruby 3.4 リファレンスマニュアル)
p ["a", "b", "c", "d"].values_at(1, 3) #=> ["b", "d"]
p ["a", "b", "c", "d"].values_at(0..2) #=> ["a", "b", "c"]
- このチケットでは以下のように
Array#values_at
に範囲外の値を渡したときに負のRange だけ例外になるのは意図する挙動なのか、という内容
[0, 1, 2, 3].values_at(10) #=> [nil]
[0, 1, 2, 3].values_at(10..10) #=> [nil]
[0, 1, 2, 3].values_at(-10) #=> [nil]
[0, 1, 2, 3].values_at(-10..-10) #=> 'Array#values_at': -10..-10 out of range (RangeError)
- これ以外にもいくつか奇妙な挙動があるみたいですね
- https://bugs.ruby-lang.org/issues/20957#note-1
- 負のRange かつ範囲外だとエラーになるぽい
- また
Array#fill
でも似たような挙動があるみたですねー
[0,1,2,3].fill(10, -10..-5) #=> RangeError
[0,1,2,3].fill(10, -5..-3) #=> RangeError
[0,1,2,3].fill(10, -3..3) #=> [0, 10, 10, 10]
[0,1,2,3].fill(10, 3..10) #=> [0, 1, 2, 10, 10, 10, 10, 10, 10, 10, 10]
- このあたりの期待する挙動はどういう形がよいのか
Discussion