簡體   English   中英

什么是Ruby相當於Python的defaultdict?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM