⛳
[Feature #15381] **obj のときに暗黙的に obj.to_h を呼び出すようにする提案
[Feature #15381] Let double splat call to_h
implicitly
-
**obj
のときに暗黙的にobj.to_h
を呼び出すようにする提案 - 現状だと
**obj
のときにはobj.to_hash
が内部で呼び出されます
class X
# ** でこれが呼び出される
def to_hash
{ a: 1 }
end
end
p **X.new
# => {:a=>1}
- これを
#to_hash
ではなくて#to_h
の呼び出しにする提案 -
*obj
だとobj.to_a
を呼び出すのでちょっとややこしいんですよね、これ
class X
# * でこれが呼び出される
def to_a
[1, 2]
end
end
p *X.new
# => [1, 2]
- 6年前のチケットなんですが最近話題になってました
- チケットの内容よりも
#to_a, to_h
と#to_ary, to_hash
の責務の話などが議論されてて読んでて面白かったです-
#to_a
は『〜に変換可能』という意味で#to_ary
は『〜と同一である』みたいな話とか
-
- どこまでを明示的に扱って、どこまでを暗黙的に扱うのかは悩ましい部分ではありますねえ
- あと面白い提案としては
**@
を追加する提案もありました- https://bugs.ruby-lang.org/issues/15381#note-11
- これだといろいろと汎用性が広がりそうですねー
Discussion