より大きなハッシュのデフォルト値としてハッシュを使用したい。しかし、外側のハッシュを介して内側のハッシュの値を設定する方法がわかりません。
h = Hash.new do
{:counter => 0}
end
h[:a][:counter] += 1
=> 1
h[:a][:counter] += 1
=> 1
h[:a][:counter] += 1
=> 1
h
=> {}
うーん、正しい方法は何ですか?
ハッシュのデフォルト値で初期化する場合:
h = Hash.new({:counter => 5})
次に、例の呼び出しパターンに従うことができます。
h[:a][:counter] += 1
=> 6
h[:a][:counter] += 1
=> 7
h[:a][:counter] += 1
=> 8
:counter
または、ブロックで初期化して、新しいキーを使用するたびにハッシュの新しいインスタンスが作成されるようにすることもできます。
# Shared nested hash
h = Hash.new({:counter => 5})
h[:a][:counter] += 1
=> 6
h[:boo][:counter] += 1
=> 7
h[:a][:counter] += 1
=> 8
# New hash for each default
n_h = Hash.new { |hash, key| hash[key] = {:counter => 5} }
n_h[:a][:counter] += 1
=> 6
n_h[:boo][:counter] += 1
=> 6
n_h[:a][:counter] += 1
=> 7