🦔

[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)
GitHubで編集を提案

Discussion