红宝石哈希设置
答
当块被传递到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,然后返回0作为该值。
这不仅仅适用于默认值 - 例如,您可以让它抛出一个例外的例外情况。事实上,如果你只想要一个默认值,你可以说:
Hash.new "defaultValue"
答
其为等于零,而不是无任何新的密钥制作的默认值,观察试验和IRB控制台会话:
$ irb
>> normal_hash = Hash.new
=> {}
>> normal_hash[:new_key]
=> nil
>> h = Hash.new {|hash, key| hash[key] = 0}
=> {}
>> h[:new_key]
=> 0
哦,很酷。这是我第一次看到哈希的特征。 – jdl 2011-03-04 22:45:16
重要的是要意识到,这将设置为0的值为任何* *检查键。这对于一个没有影响的行动来说是一个相当的副作用,所以我通常建议不要这样做。通常最好在你要求的地方赶上零案例,比如'x = h.key?(y)? h [y]:0'或'x = h [y] || 0'。 – 2011-03-05 01:16:27
除非,当然,这个副作用正是你为什么以这种方式宣布散列的原因。 – 2011-03-05 06:12:07