[英]What's the Ruby equivalent of Python's defaultdict?
在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)
您可以使用default=
指定默認值:
d.default = 0
請注意,這不會真正自動生成,它只是使d[:new_key]
返回零而不實際添加:new_key
鍵。 如果您打算修改默認值, default=
也會導致問題; 這意味着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 }
您可以使用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 }
Hash的標准new
方法接受塊。 如果嘗試訪問Hash中不存在的密鑰,則調用此塊。 該塊傳遞Hash本身和請求的密鑰(兩個參數),並應返回應為請求的密鑰返回的值。
這可用於創建自動生成的哈希,以及其他內容:
h = Hash.new{ |h,k| h[k] = 'default value'}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.