如果我尝试增加哈希中尚不存在的键的值,那么
h = Hash.new
h[:ferrets] += 1
我收到以下错误:
NoMethodError: undefined method `+' for nil:NilClass
这对我来说很有意义,而且我知道这一定是一个非常简单的问题,但是我很难在SO上找到它。如果我事先不知道我将拥有哪些密钥,如何添加和增加此类密钥?
答案 0 :(得分:18)
您可以在构造函数
中设置hash的默认值h = Hash.new(0)
h[:ferrets] += 1
p h[:ferrets]
请注意,设置默认值有一些缺陷,因此您必须小心使用它。
h = Hash.new([]) # does not work as expected (after `x[:a].push(3)`, `x[:b]` would be `[3]`)
h = Hash.new{[]} # also does not work as expected (after `x[:a].push(3)` `x[:a]` would be `[]` not `[3]`)
h = Hash.new{Array.new} # use this one instead
因此在某些情况下使用||=
可能很简单
h = Hash.new
h[:ferrets] ||= 0
h[:ferrets] += 1
答案 1 :(得分:4)
解决此问题的一种方法是将哈希值设为默认值:
h = Hash.new
h.default = 0
h[:ferrets] += 1
puts h.inspect
#{:ferrets=>1}
哈希的默认默认值是nil,而nil并不了解如何使用++本身。
h = Hash.new{0}
h = Hash.new(0) # also works (thanks @Phrogz)
是另一种在声明时设置默认值的方法。