07/05/13 23:01:50
>>304
えーと、どこから説明していいものか。ちょっと複雑になるけど説明してみる。
まずその例は値を与えていないハッシュのキーに初期値を与えたいってことだよね。
んで初期値を整数にしたいときはh = Hash.new(0)でできる。このとき、
h[1]=0とか代入しなくてもh[1]は0になる。ここまではいいね?
では初期値として"baka"(文字列)を与えてみたらどうなるか。
h2 = Hash.new("baka")
p h2[1] # => "baka"
h2[1] << "shine"
p h2[1] #=> "bakashine"
p h2[2] #=> "bakashine" ??? "baka"ではないの?
ということになる。それぞれの初期値は同じインスタンスを指しているためにこういったことが起こる。
これは直感に反する動きなのでそれを解決するためにブロックを渡せるようにした。
h2 = Hash.new{|h, k| h[k] = "baka"} # その都度新しいStringオブジェクトを生成して代入
p h2[1] # => "baka"
h2[1] << "shine"
p h2[1] #=> "bakashine"
p h2[2] #=> "baka"
というわけ。ややこしいけど。