数组中出现的Ruby-nils
我在帮一个朋友完成一项ruby任务时,遇到了一些奇怪的行为。我们已经对它进行了重构,使用散列并直接通过散列增加计数,所以这段代码已经过时了,但是为了我自己的理智,我需要知道为什么在数据包数组中显示nil值。最奇怪的是,它并不总是发生,它只发生在一些处决 我应该注意到,代码的目的基本上是统计一行中随机值低于p的次数数组中出现的Ruby-nils,ruby,arrays,null,Ruby,Arrays,Null,我在帮一个朋友完成一项ruby任务时,遇到了一些奇怪的行为。我们已经对它进行了重构,使用散列并直接通过散列增加计数,所以这段代码已经过时了,但是为了我自己的理智,我需要知道为什么在数据包数组中显示nil值。最奇怪的是,它并不总是发生,它只发生在一些处决 我应该注意到,代码的目的基本上是统计一行中随机值低于p的次数 count = 0 p = 0.1 packets = [] counts = [] 10000.times do if rand.round(1) <= p co
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
count=0
p=0.1
数据包=[]
计数=[]
一万倍
如果兰德圆(1)0
packets您确定您的packets
数组得到了nil
s吗?你发布的代码基本上不可能发生这种情况。转储数据包
数组以确保安全
但是,我确实注意到,代码有时会出现以下错误:
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>'
此错误意味着计数。fetch(train,0)
为nil
(如果train
为nil
,则会出现强制错误)。例如,如果您在设置计数[2]
之前设置计数[3]
,然后访问计数[2]
(因为Ruby将用nil
s填充“跳过”的数组元素),则会发生这种情况
如果您在数据包中实际得到nil
s,那么您的Ruby中可能有恶魔。是的,这就是原因。代码在较早的索引之前设置计数
,这导致在数组之前填充nil。
counts[train] = counts.fetch(train, 0) + train