2013-11-03 103 views
13

在Python中,我可以創建一個散列,其中每個元素在首次引用時都具有默認值(也稱爲「autovivification」)。這裏有一個例子:什麼是Python的默認代碼的Ruby等價物?

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

打印字典顯示「new_key」的值爲1

什麼是Ruby中等價?此代碼拋出一個錯誤:

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

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

回答

9

可以使用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 } 
+0

如何創建既具有默認值,鍵'哈希:unknown_key'和':next_key'? – rightfold

17

您可以指定使用default=默認值:

d.default = 0 

注意,這不會真的autovivify雖然,它只是使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 } 
+2

這需要被接受的答案。 –

+1

我同意。我無法刪除我的答案,因此我會爲其添加註釋。 – tessi

8

爲哈希標準new方法接受的塊。當試圖訪問不存在的哈希鍵時,將調用該塊。該塊傳遞哈希本身和被請求的密鑰(兩個參數),並且應該返回應該爲請求的密鑰返回的值。

這可以被用來創建一個autovivified哈希,除其他事項外:

h = Hash.new{ |h,k| h[k] = 'default value'} 
相關問題