🐕
[Bug #19231] 0.step(Float::INFINITY) で値を取得するときに意図しない挙動になっているバグ報告
[Bug #19231] Integer#step and Float::INFINITY - inconsistent behaviour when called with and without a block
-
0.step(Float::INFINITY)
に対して値を取得するときに取得の仕方によって返ってくる値が異なるバグ報告 -
take
を経由して値を取得する場合はFloat
が返ってくる
pp 0.step(Float::INFINITY).take(1)
# => [0.0]
- 一方でブロック引数で値を取得する場合は
Integer
が返ってくる
pp 0.step(Float::INFINITY) { break _1 }
# => 0
-
#step
の引数が有限数だった場合はFloat
が返ってくる
pp 0.step(100.0).take(1)
# => [0.0]
pp 0.step(100.0) { break _1 }
# => 0.0
- また
#first
の場合は以下のような挙動になる
# 無限の場合も有限の場合も Integer を返す
pp 0.step(Float::INFINITY).first # => 0
pp 0.step(100.0).first # => 0
# 引数がある場合は Float を返す
pp 0.step(Float::INFINITY).first(1) # => [0.0]
pp 0.step(100.0).first(1) # => [0.0]
- 以下のようにバージョンによっていろいろと変わっているみたいですね
-
0.step(Float::INFINITY, 10).each
の場合- Ruby ~ 2.0:
Float
- Ruby 2.1 ~ 2.5:
Integer
- Ruby 2.6 ~ :
Float
- Ruby ~ 2.0:
-
0.step(Float::INFINITY, 10) { ... }
の場合- Ruby ~ 2.0:
Float
- Ruby 2.1 ~ :
Integer
- Ruby ~ 2.0:
- https://bugs.ruby-lang.org/issues/19231#note-2
-
-
https://github.com/nobu/ruby/commit/332a08f5d4e4b5c3fcb0b7e73b19628ac61f37a8#diff-212d624c3bd338cf8a8bec98ebf2104f045759a47f8aba63a213db97f30eed22 の修正だと
Integer
に統一されている- これはまだマージされてない
Discussion