🔖

[Feature #21390] Enumerable#to_set に引数を渡すことを禁止する提案

に公開

[Feature #21390] Deprecate passing arguments to Set#to_set and Enumerable#to_set

  • Enumerable#to_set を使うことで Enumerator から Set へと値を変換することができる
enum = [1, 2, 3].to_enum

pp enum.to_set
  • この #to_set にはサブクラスを渡すことができて『どのクラスでオブジェクトを生成するのか』が指定することができる
class MySet < Set
end

enum = [1, 2, 3].to_enum

# MySet のオブ樹エクとを返す
pp enum.to_set(MySet)
# => #<MySet: {1, 2, 3}>
  • これなんですが他の #to_a#to_h ではサブクラスが指定できなかったり Set 以外のサブクラスを渡した場合に意図しない挙動になるのでこの機能を非推奨にしよう、というチケット
  • 以下のコードは特にエラーにならずに動いちゃうんですねー
enum = [1,2,3].to_enum

enum.to_set(Hash)
enum.to_set(Struct.new("A", :a))
enum.to_set(ArgumentError)
enum.to_set(Thread){}
  • これは受け入れられて Enumerable#to_set Set#to_set は開発版の Ruby 3.5-dev では上記の機能を利用すると警告がでるようになる
class MySet < Set
end

enum = [1, 2, 3].to_enum

# これは今まで通り利用できる
pp enum.to_set
# => no warning

# 引数を渡すと警告が出るようになる
pp enum.to_set(MySet)
# Ruby 3.4 => no warning
# Ruby 3.5 => warning: passing arguments to Enumerable#to_set is deprecated
GitHubで編集を提案

Discussion