1.
Hash.new([])を使うと、keyが存在しないときに空配列を値にすることができるけれど、それはすべてのkeyで共有されてしまうオブジェクトなので、以下のようなことが起きてしまう。
h = Hash.new([])
h["foo"] << 123
h["foo"] << 456
h["baa"] << 1111
h["baa"] << 2222
p h["foo"] #=> [123, 456, 1111, 2222]
p h["baa"] #=> [123, 456, 1111, 2222]
2.
次のようにブロックを使えば、keyが存在しないときにkeyごとに別の空配列を値にできる。これをやりたい。
h = Hash.new { |hash,key| hash[key] = [] }
h["foo"] << 123
h["foo"] << 456
h["baa"] << 1111
h["baa"] << 2222
p h["foo"] #=> [123, 456]
p h["baa"] #=> [1111, 2222]
質問
みなさんは、上の2.のようなことをやりたいときに、Hash.new { |hash,key| hash[key] = [] } のように書きますか?
何かイディオムがありそうだけれど、見つけられなかったので質問しました。ご教示いただければ感謝です。