Ruby - nils出现在数组中

时间:2014-02-27 03:07:51

标签: ruby arrays null

我正在用红宝石的任务帮助一个朋友,我遇到了一些奇怪的行为。我们已经重构它以使用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。可能导致这种情况的原因是什么?

1 个答案:

答案 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(如果trainnil,则会收到强制错误)。例如,如果在设置counts[3]之前设置counts[2],稍后访问counts[2](因为Ruby将使用{{1}填充“跳过”的数组元素,则会发生这种情况。 } S)。

如果你实际上在nil中获得了nil,那么你的Ruby中可能会有恶魔。