Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
数组中出现的Ruby-nils_Ruby_Arrays_Null - Fatal编程技术网

数组中出现的Ruby-nils

数组中出现的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

我在帮一个朋友完成一项ruby任务时,遇到了一些奇怪的行为。我们已经对它进行了重构,使用散列并直接通过散列增加计数,所以这段代码已经过时了,但是为了我自己的理智,我需要知道为什么在数据包数组中显示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
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