[Feature #15381] **obj のときに暗黙的に obj.to_h を呼び出すようにする提案

2024/10/15に公開

[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 は『〜と同一である』みたいな話とか
  • どこまでを明示的に扱って、どこまでを暗黙的に扱うのかは悩ましい部分ではありますねえ
  • あと面白い提案としては **@ を追加する提案もありました
GitHubで編集を提案

Discussion