【发布时间】:2013-11-06 03:39:15
【问题描述】:
我一直在阅读 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)插入数字数组?
【问题讨论】:
-
假设你在
num不是哈希键时执行numbers = Hash.new(0)然后numbers[num] += 1。由于您在创建哈希时给出了默认值0,当Ruby 发现num不是哈希键时,它会创建一个新的哈希元素h[num] = 0。然后它执行h[num] += 1 # => 1并且 Bob 是你的叔叔。 -
谢谢,这更有意义。
-
如果您想知道,当
new被赋予默认参数时,除非执行分配,否则Ruby 不会创建哈希元素。例如,如果h = Hash.new(0),h[6]将在 if 语句if h[6] == 0中等于nil,导致条件为false,并且不会创建 key = 6 的哈希元素(否则会导致如果条件被评估为true)。