如何为散列中的未初始化键增加值?

时间:2014-05-29 03:03:09

标签: ruby hashtable

如果我尝试增加哈希中尚不存在的键的值,那么

h = Hash.new
h[:ferrets] += 1

我收到以下错误:

NoMethodError: undefined method `+' for nil:NilClass

这对我来说很有意义,而且我知道这一定是一个非常简单的问题,但是我很难在SO上找到它。如果我事先不知道我将拥有哪些密钥,如何添加和增加此类密钥?

2 个答案:

答案 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)

是另一种在声明时设置默认值的方法。