1

より大きなハッシュのデフォルト値としてハッシュを使用したい。しかし、外側のハッシュを介して内側のハッシュの値を設定する方法がわかりません。

h = Hash.new do 
  {:counter => 0}
end
h[:a][:counter] += 1
=> 1 
h[:a][:counter] += 1
=> 1
h[:a][:counter] += 1
=> 1 
h
=> {}

うーん、正しい方法は何ですか?

4

2 に答える 2

4

ハッシュのデフォルト値で初期化する場合:

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 
于 2012-07-06T02:39:45.113 に答える