📌

【Ruby 4.0 Advent Calender】`Enumerable#to_set` の引数が非推奨になる【8日目】

に公開

Ruby 4.0 Advent Calender 8日目の記事です。

これはなに

今年 2025年12月25日にリリースされる予定の Ruby 4.0 の新機能や変更点などを1つずつ紹介していく Advent Calender になります。
基本的には NEWS に載っている機能を紹介すると思うんですがここにない機能についても書くかもしれません。
また、記事を書いてる時点ではまだ Ruby 4.0 はリリースされる前なので Ruby 4.0 がリリースされた時点で機能が変わっている 可能性があるかもしれないので注意してください。
記事のまとめは ここを参照 してください。

Enumerable#to_set の引数が非推奨になる

Enumerable#to_set はレシーバのオブジェクトを Set のオブジェクトへと変換を行うメソッドです。

enum = [1, 2, 3, 2, 3, 1, 4]

p enum.to_set
# => #<Set: {1, 2, 3, 4}>

この Enumerable#to_set には引数を渡すことができて『どの Set のサブクラスで変換するのか』を指定することができます。

class MySet < Set
end

enum = [1, 2, 3]

# 引数のクラスのインスタンスオブジェクトとして返す
p enum.to_set(MySet)
# => #<MySet: {1, 2, 3}>

Ruby 4.0 ではこの『引数を渡したとき』の挙動が非推奨になり、警告が出るようになります。

class MySet < Set
end

enum = [1, 2, 3].to_enum

# 引数を渡さない場合は特に警告はでない
p enum.to_set
# Ruby 3.4 => no warning
# Ruby 4.0 => no warning

# 引数を渡さない場合に警告が出るようになる
p enum.to_set(MySet)
# Ruby 3.4 => no warning
# Ruby 4.0 => warning: passing arguments to Enumerable#to_set is deprecated

また、この警告は -W が有効でない場合でも出力されます。

この機能が非推奨になった経緯として『他の #to_a#to_h ではサブクラスが指定できない』『Set 以外のサブクラスを渡した場合に意図しない挙動になる』という点が上げられています。
後者に関してなんですが現状の #to_set に『 Set のサブクラス以外』を渡してもエラーにならずに動作します。

enum = [1,2,3]

# いかは特にエラーにならない
p enum.to_set(Hash) # => {}
p enum.to_set(Struct.new("A", :a)) # => #<struct Struct::A a=[1, 2, 3]>
p enum.to_set(ArgumentError)        # => #<ArgumentError: [1, 2, 3]>
p enum.to_set(Thread){}             # => #<Thread:0x0000742335b28370 test.rb:7 run>

これらが理由で今回非推奨にする流れになりました。

関連

GitHubで編集を提案

Discussion