2010年
1月
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

setup diary

2007|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|06|08|11|
2015|01|02|03|04|05|06|07|08|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|

2010-01-17 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
なんだか少し納得がいかない。