2013-11-03 15 views
13

Pythonでは、最初に参照されたときに各要素がデフォルト値を持つハッシュを作成できます(「自動化」とも呼ばれます)。ここでは例です:Pythonのdefaultdictに相当するRubyは何ですか?

from collections import defaultdict 
d = defaultdict(int) 
d["new_key"] += 1 
print d 

辞書の印刷「new_key」の値がRubyで同等の何1.

であることを示していますか?このコードは、エラーがスローされますように注意してください

d = Hash.new 0 
d[:new_key] += 1 
d[:new_key] #=> 1 
d[:foo]  #=> 0 

- あなたが誤ってデフォルト値を変更する場合があります:

d = {} 
d[:new_key] += 1 
puts d 

test.rb:3:in `<main>': undefined method `+' for nil:NilClass (NoMethodError) 

答えて

9

あなたはそのためのHash.newメソッドの最初の引数を使用することができます

h = Hash.new("Go Fish") 
h[:unknown_key]   #=> "Go Fish" 
h[:unknown_key].upcase! #=> "GO FISH" 
h[:next_key]   #=> "GO FISH" 

「muが短すぎる」と回答したときには、次のようにprocを改善する必要があります。

h = Hash.new { |h, k| h[k] = 0 } 
+0

はどのようにして 'デフォルト値とキーの両方を持つハッシュを作成してください:unknown_key'と':next_key'を? – rightfold

17

あなたはdefault=を使用してデフォルト値を割り当てることができます。これは実際にもautovivifyないことを

d.default = 0 

注意を、それだけでd[:new_key]が実際に:new_keyキーを追加せずにゼロを返します。 default=は、デフォルト値を変更する場合にも問題を引き起こす可能性があります。つまり、d.default = [ ]は、デフォルトがアクセスされたときに配列がコピーされないため、ほとんど常に間違いです。これは、あなたが明確なデフォルト値を持つことができます

d.default_proc = proc { |h, k| h[k] = 0 } 

、それはあなたが新しいキーを追加することができます(またはprocが構造化されてどのように依存しない):

より良い選択は、通常default_proc=です。

ハッシュを作成するときは、これらを設定することができます。

d = Hash.new(0) 
d = Hash.new { |h, k| h[k] = 0 } 
+2

これは受け入れられる回答である必要があります。 –

+1

私は同意します。私は私の答えを削除することはできませんので、私はそれにメモを追加します。 – tessi

8

ハッシュのための標準的なnew方法は、ブロックを受け入れます。このブロックは、存在しないハッシュのキーにアクセスしようとした場合に呼び出されます。ブロックは、ハッシュ自体と要求されたキー(2つのパラメータ)を渡され、要求されたキーに対して返される値を返す必要があります。

これは、とりわけ、自動活性化ハッシュを作成するために使用することができます。

h = Hash.new{ |h,k| h[k] = 'default value'} 
関連する問題