🐈

[Bug #20980] 先端無限の場合に Range#size の結果が変わったというバグ報告

2025/01/18に公開

[Bug #20980] Range#size new TypeError vs semi-open ranges

  • 先端無限の場合に Range#size が Ruby 3.4 で結果が変わるようになった
    • 元々 nilInfinity を返していたが例外が発生するようになった
# 終端無限の場合は nil が返ってくる
p ('a'..).size # => nil

# 先端無限の場合も nil が返ってきていたが例外が発生するようになった
p (..'a').size
# Ruby 3.3 => nil
# Ruby 3.4 => error: can't iterate from NilClass (TypeError)
# 数値の場合
p (3..).size # => Infinity
p (..3).size
# Ruby 3.3 => nil
# Ruby 3.4 => error: can't iterate from NilClass (TypeError)
  • これなんですが Ruby 3.4 が意図する挙動になるみたいですね
    • 基本的には #size#each に渡されたブロックが何回呼び出されるのか、を返す
    • 終端無限の場合は終わりはないが #each 自体は処理される
    • 先端無限の場合はそもそも #each が例外になる(ので #size も例外になるのは自然
    • see: https://bugs.ruby-lang.org/issues/20980#note-1
  • 意図する挙動ではあるんですが挙動が異なるので注意する必要があります
GitHubで編集を提案

Discussion