🎉

[Feature #20894] 先端無限Range のときに Range#last(n) を許容する提案

2024/11/27に公開

[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 で議論されていた気がするけどどこだったかなあ…
GitHubで編集を提案

Discussion