我正在用红宝石的任务帮助一个朋友,我遇到了一些奇怪的行为。我们已经重构它以使用Hash并直接通过它增加计数,所以这段代码已经过时了,但是为了我自己的理智,我需要知道为什么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。可能导致这种情况的原因是什么?
答案 0 :(得分:1)
您某些您的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[3]
之前设置counts[2]
,稍后访问counts[2]
(因为Ruby将使用{{1}填充“跳过”的数组元素,则会发生这种情况。 } S)。
如果你实际上在nil
中获得了nil
,那么你的Ruby中可能会有恶魔。