2013-11-03 64 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'} 
相关问题