小ネタ
h = Hash.new {|h, k| h[k] = Hash.new {|h, k| h[k] = {} } }
p h[:a] #=> {}
p h[:a][:b] #=> {}
p h[:a][:b][:c] #=> nil
p h #=> {:a=>{:b=>{}}}
↓
rh = Hash.new {|h, k| h[k] = Hash.new(&h.default_proc) }
p rh[:a] #=> {}
p rh[:a][:b] #=> {}
p rh[:a][:b][:c] #=> {}
p rh #=> {:a=>{:b=>{:c=>{}}}}
Hash#default_proc
を利用して再帰的にHash.newを行うようにすることで、どこにアクセスしても {}
を返してくれるHashを定義することが出来ます。