を使用して、デフォルトの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
を使用して、デフォルトの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
実際にハッシュに値を割り当てるのではなく、ハッシュと独立した0の値を返すだけです。これらは変更されてから投げ捨てられます。割り当てを行うことで
修正これを:test_hash.inspect
を呼び出し、その後test_hash[1][1]
にアクセスした後、それは空のままだから
test_hash = Hash.new { |h,k|
h[k] = Hash.new(0)
}
あなたが何かを伝えることができますが間違っていました。
タドマンの回答は(途中)正しいですが、少し誤解を招くかもしれません。
埋め込みハッシュに値を割り当てますが、埋め込みハッシュをメインハッシュに割り当てません。メインハッシュでキーが呼び出されるたびに、新しい埋め込みハッシュが作成されます。埋め込みハッシュに値を割り当てた後、{1 => 1}
になっている埋め込みハッシュは、メインハッシュに割り当てられず、破棄されます。
「Hash.new」ブロックは、新しいキーが入力されるたびに呼び出され、ハッシュに何かをする義務はありませんが、通常は変更することをお勧めします。あなたが 'h [k] = ...'やそれ以外のものを呼び出すのでなければ、あなたの値はハッシュから独立して保存されません。 – tadman
ありがとう! これはなぜ機能しますか? test_hash = Hash.new {| h、k | []} test_hash + = ['something'] –
私は{}に対して未定義のメソッド '+ 'を取得します。これは驚くことではありませんが、ハッシュ(NoMethodError)です。それはうまくいかない。 – tadman