我一直在阅读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 文档 中,Hash
的默认值为 nil
,这就是我假设出现此错误的原因。是否有更好的方法将每个键/(值 += 1) 插入到 numbers 数组中?
numbers = Hash.new(0)
,然后在num
不是哈希键时执行numbers[num] += 1
。由于在创建哈希时给定了默认值0
,当 Ruby 发现num
不是哈希键时,它会创建一个新的哈希元素h[num] = 0
。然后它执行h[num] += 1 # => 1
,就完成了。 - Cary Swovelandnew
有一个默认参数时,Ruby只有在执行赋值操作时才会创建哈希元素。例如,如果h = Hash.new(0)
,那么在if语句if h[6] == 0
中,h[6]
将等于nil
,导致条件为假,并且不会创建键为6的哈希元素(否则会导致if条件为真)。 - Cary Swoveland