2016-05-04 26 views
0

を使用して、デフォルトのPROCでハッシュを更新するときに、なぜこのハッシュは次のとおりです。奇妙な行動+ =

test_hash = Hash.new{|hash, key| 
       Hash.new{|second_level_hash, second_level_key| 0 } 
      } 

次の操作によって更新されませんか?

test_hash[1][1] += 1 
test_hash[1][1] # => 0 

答えて

4

実際にハッシュに値を割り当てるのではなく、ハッシュと独立した0の値を返すだけです。これらは変更されてから投げ捨てられます。割り当てを行うことで

修正これを:test_hash.inspectを呼び出し、その後test_hash[1][1]にアクセスした後、それは空のままだから

test_hash = Hash.new { |h,k| 
    h[k] = Hash.new(0) 
} 

あなたが何かを伝えることができますが間違っていました。

+1

「Hash.new」ブロックは、新しいキーが入力されるたびに呼び出され、ハッシュに何かをする義務はありませんが、通常は変更することをお勧めします。あなたが 'h [k] = ...'やそれ以外のものを呼び出すのでなければ、あなたの値はハッシュから独立して保存されません。 – tadman

+0

ありがとう! これはなぜ機能しますか? test_hash = Hash.new {| h、k | []} test_hash + = ['something'] –

+0

私は{}に対して未定義のメソッド '+ 'を取得します。これは驚くことではありませんが、ハッシュ(NoMethodError)です。それはうまくいかない。 – tadman

2

タドマンの回答は(途中)正しいですが、少し誤解を招くかもしれません。

埋め込みハッシュに値を割り当てますが、埋め込みハッシュをメインハッシュに割り当てません。メインハッシュでキーが呼び出されるたびに、新しい埋め込みハッシュが作成されます。埋め込みハッシュに値を割り当てた後、{1 => 1}になっている埋め込みハッシュは、メインハッシュに割り当てられず、破棄されます。