21

Python では、各要素が最初に参照されたときにデフォルト値を持つハッシュを作成できます (「autovivification」とも呼ばれます)。次に例を示します。

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

dict を印刷すると、「new_key」の値が 1 であることが示されます。

Rubyで同等のものは何ですか? このコードはエラーをスローします:

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

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

3 に答える 3

26

以下を使用してデフォルト値を割り当てることができますdefault=

d.default = 0

ただし、これは実際には自動有効化されないことに注意してください。実際にキーd[:new_key]を追加せずにゼロを返すだけです。デフォルト値を変更しようとすると、問題が発生する可能性もあります。これは、デフォルトがアクセスされたときに配列がコピーされないため、ほとんどの場合間違いであることを意味します。:new_keydefault=d.default = [ ]

通常、より良い選択は次のdefault_proc=とおりです。

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

これにより、個別のデフォルト値を持つことができ、新しいキーを追加できます (または の構造に依存しませんproc)。

ハッシュの作成時にこれらを設定することもできます。

d = Hash.new(0)
d = Hash.new { |h, k| h[k] = 0 }
于 2013-11-03T20:12:28.607 に答える
18

Hash.newそのために、メソッドの最初の引数を使用できます。

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

注意してください - 誤ってデフォルト値を変更してしまう可能性があります:

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 }
于 2013-11-03T20:08:21.780 に答える
9

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

これは、特に自動有効化されたハッシュを作成するために使用できます。

h = Hash.new{ |h,k| h[k] = 'default value'}
于 2013-11-03T20:30:47.467 に答える