🎉
[Feature #20894] 先端無限Range のときに Range#last(n) を許容する提案
[Feature #20894] Allow Range#last(n)
for beginless ranges with Integer end
- 先端無限Range のときに
Range#last(n)
を許容する提案 -
Range#last(n)
は終端からn
個分の要素を抽出するメソッドですね
# 終端から3つの要素を配列で取得する
pp (1..10).last(3)
# => [8, 9, 10]
- ただし、先端無限の場合はこれがエラーになります
# error: can't iterate from NilClass (TypeError)
(..10).last(3)
- これ、結構挙動がややこしくて引数がない場合はエラーにならないんですよね
pp (..10).last
# => 10
- Ruby 3.3 では以下のように
#reverse_each
が利用できるようになったので、これが許容されるのであればRange#last(n)
も受け入れられるべきと書かれていますねー
pp (..10).reverse_each.first(3)
# => [10, 9, 8]
- ちなみに
Range#max
でも似たような挙動になります
# OK: 動作する
pp (1..10).max(3) # => [10, 9, 8]
# OK: 動作する
pp (1..10).max # => 10
# NG: error: cannot get the maximum of beginless range with custom comparison method (RangeError)
pp (..10).max(3)
- ここら辺むずかしい…
- 似たような話がどこかの issues で議論されていた気がするけどどこだったかなあ…
Discussion