我正在帮助一个朋友完成红宝石任务,我遇到了一些奇怪的行为。我们已经重构了它以使用哈希并直接通过它增加计数,所以这段代码已经过时了,但为了我自己的理智,我需要知道为什么 nil 值出现在数据包数组中。最奇怪的是,它并不总是发生,它只发生在某些处决中。
我应该注意,代码的目的本质上是计算随机值低于 p 的连续次数。
count = 0
p = 0.1
packets = []
counts = []
10000.times do
if rand.round(1) <= p
count += 1
elsif count > 0
packets << count
count = 0
end
end
packets.each do |train|
counts[train] = counts.fetch(train, 0) + train
end
counts.each_with_index do |value, index|
puts "Train Length: #{index} Count: #{value}"
end
数据包数组应该只包含数值,但它最终会包含多个 nil。可能是什么原因造成的?
你确定你的packets
数组正在nil
吗?您发布的代码基本上不会发生这种情况。转储packets
数组以确保。
但是,我确实观察到代码有时会失败并显示以下错误:
NoMethodError: undefined method `+' for nil:NilClass
from (irb):16:in `block in irb_binding'
from (irb):15:in `each'
from (irb):15
from /usr/bin/irb:12:in `<main>'
从生产线
counts[train] = counts.fetch(train, 0) + train
此错误意味着counts.fetch(train, 0)
nil
(如果train
nil
,则会收到强制错误)。例如,如果您在设置counts[2]
之前设置了counts[3]
,然后访问counts[2]
,则可能会发生这种情况(因为 Ruby 会用 nil
s 填充您"跳过"的数组元素)。
如果你真的在packets
中得到nil
,那么你的Ruby中可能有恶魔。