hashのhash


rubyのhashのくせ?
hashを値として持つhashを作るときに、

h={}
h[1][2]=3
p h

とすると、h[1]がnilなのに[]=というmethodを呼び出すので、エラーになる。そこで、次のようにすれば問題ないだろうと思って実行してみたが、うまくいかない。

h=Hash.new({})
h[1][2]=3
p h

ここでは、h[1]はすでにdefault値の{}になっているので、エラーは起きないが、hを表示すると{}となる。これは、バグなのかどうかは微妙なところだが、不思議な挙動な気がする。しかたがないので、冗長にはなるが、次のように書いたら当然だがうまく動いた。

h={}
h[1]={} unless h[1]
h[1][2]=3
p h

なんだか少し納得がいかない。