🐈
[Bug #20980] 先端無限の場合に Range#size の結果が変わったというバグ報告
[Bug #20980] Range#size new TypeError vs semi-open ranges
- 先端無限の場合に
Range#size
が Ruby 3.4 で結果が変わるようになった- 元々
nil
やInfinity
を返していたが例外が発生するようになった
- 元々
# 終端無限の場合は 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
- 基本的には
- 意図する挙動ではあるんですが挙動が異なるので注意する必要があります
Discussion