🦔
[Bug #21513] Range#to_set と to_a で一貫性がないバグ報告
[Bug #21513] Converting endless range to set hangs
- 終端無限Range に対して
Range#to_aを呼び出すと次のようにRangeErrorが発生する
# error: cannot convert endless range to an array (RangeError)
(1..).to_a
- しかし
Range#to_setの場合はRangeErrorが発生せずにハングする
# 処理が返ってこずに内部でずーっとループしてしまっている
(1..).to_set
- これらが一貫性がないので
RangeErrorに寄せるという提案- 厳密に言うと最終的にはバグ修正として扱われている
- 内部で無限ループするよりかは
RangeErrorが発生したほうがアプリケーション的にはよいっていう話ではありますね - これなんですが開発版の Ruby 3.5-dev では
Range#to_setではなくてSet#initializeに無限Range を渡すとArgumentErrorが発生するように対応されました
Set.new(1..nil)
# Ruby 3.4 => hangs
# Ruby 3.5 => cannot initialize Set from an object with infinite size (ArgumentError)
# 結果的に Range#to_set でも同様のエラーが発生するようになる
(1..).to_set
# Ruby 3.4 => hangs
# Ruby 3.5 => cannot initialize Set from an object with infinite size (ArgumentError)
Discussion