红宝石 - 出现在数组中的 nils



我正在帮助一个朋友完成红宝石任务,我遇到了一些奇怪的行为。我们已经重构了它以使用哈希并直接通过它增加计数,所以这段代码已经过时了,但为了我自己的理智,我需要知道为什么 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中可能有恶魔。

相关内容

  • 没有找到相关文章

最新更新