🔖
[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_setSet#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
Discussion