2011-03-04 244 views
2

我发现这个在我的一些代码我工作,我想知道这是什么东西做的红宝石哈希设置

h = Hash.new {|hash, key| hash[key] = 0} 
=> {} 

回答

7

当块被传递到Hash.new该块每次一个不存在的键调被访问。例如:

h = Hash.new { |hash, key| hash[key] = "Default" } 
h[:defined_key] = "Example"  

puts h[:defined_key] # => "Example" 
puts h[:undefined_key] # => "Default" 

更多细节见http://ruby-doc.org/core/classes/Hash.html#M000718

+0

哦,很酷。这是我第一次看到哈希的特征。 – jdl 2011-03-04 22:45:16

+0

重要的是要意识到,这将设置为0的值为任何* *检查键。这对于一个没有影响的行动来说是一个相当的副作用,所以我通常建议不要这样做。通常最好在你要求的地方赶上零案例,比如'x = h.key?(y)? h [y]:0'或'x = h [y] || 0'。 – 2011-03-05 01:16:27

+0

除非,当然,这个副作用正是你为什么以这种方式宣布散列的原因。 – 2011-03-05 06:12:07

2

http://ruby-doc.org/core/classes/Hash.html#M000718

此块定义访问不存在的键时,哈希做什么。所以如果没有键的值,那么它将该值设置为0,然后返回0作为该值。

这不仅仅适用于默认值 - 例如,您可以让它抛出一个例外的例外情况。事实上,如果你只想要一个默认值,你可以说:

Hash.new "defaultValue" 
0

其为等于零,而不是无任何新的密钥制作的默认值,观察试验和IRB控制台会话:

$ irb 
>> normal_hash = Hash.new 
=> {} 
>> normal_hash[:new_key] 
=> nil 
>> h = Hash.new {|hash, key| hash[key] = 0} 
=> {} 
>> h[:new_key] 
=> 0