RubyのHashのデフォルト値の指定

RubyではHash.newするときにブロックを指定すると未知のキーを作った時にそのブロックが実行される。そしてブロックの引数には対象のハッシュとキーが渡ってくるのでそれを使ってデフォルト値を定義できる。

例えば、次のように書くとハッシュのデフォルト値を空の配列にすることができる

foo = Hash.new { |hash, key| hash[key] = [] }

そうすると次のように書ける

foo['bar'] << 'baz'
p foo #=> {"bar"=>["baz"]}

次のようにネストしたハッシュを定義するときにも使える。

foo = Hash.new { |hash, key| hash[key] = {} }
foo['bar']['baz'] = 'hoge'
p foo #=> {"bar"=>{"baz"=>"hoge"}}

便利。