Ruby Hash初始化(默认值为nil)

时间:2013-11-06 03:39:15

标签: ruby hash

我一直在阅读Ruby文档,并查看有关此问题的其他帖子,但我仍然对此感到疑惑:

#counts each number in an array once
array = [1,1,2,5,3,2,5,3,3,3]
numbers = {}
array.each { |num| numbers[num] += 1 }

=> in `block in mode': undefined method `+' for nil:NilClass (NoMethodError)

Hash documentation中,Hash的默认值为nil,这就是我假设我收到此错误的原因。有没有更好的方法将每个键/(值+ = 1)插入数字数组?

5 个答案:

答案 0 :(得分:24)

尝试将default值传递给新哈希

numbers = Hash.new(0)

答案 1 :(得分:7)

您可以创建一个使用0作为默认值的哈希:

numbers = Hash.new(0)

答案 2 :(得分:2)

你也可以用这种方式明确地做到这一点:

array.each { |num| numbers[num] = (numbers[num] || 0) + 1 }

答案 3 :(得分:2)

injectHash.new(0)

的变体
  numbers = [1,1,2,5,3,2,5,3,3,3].inject(Hash.new(0)){|numbers, number| numbers[number] +=1; numbers}

答案 4 :(得分:1)

除了使用哈希默认值,您还可以尝试使用group_by

array = [1,1,2,5,3,2,5,3,3,3]
numbers = Hash[*array.group_by { |i| i }.flat_map { |k, v| [k , v.size] }]

如果你玩一些它可能有更好的方法。