如何在数组中将nil转换为0以获得总和?

时间:2017-05-12 06:49:29

标签: arrays ruby sum conways-game-of-life

使用2d阵列处理Conway的生命游戏版本,并且在尝试计算每个单元格" s"邻居"的总和时,我继续被nil值阻止。

  def neighbor_count
      grid.each_with_index do |row, idx|
          row.each_with_index do |column, idx2|
              [grid[idx - 1][idx2 - 1], grid[idx - 1][idx2], grid[idx - 1][idx2 + 1],
              grid[idx][idx2 - 1], grid[idx][idx2], grid[idx][idx2 + 1],
              grid[idx + 1][idx2 - 1], grid[idx + 1][idx2], grid[idx + 1][idx2 + 1]
              ].compact.sum

          end
      end
  end
如果包含" puts"

.compact似乎会产生最大的结果。在阵列前面,但我试过的选项都没有给我100%。我尝试过reduce(:+),inject,.to_i,reject(去除nil值),等等。

这里缺少什么?

错误:world.rb:35:block (2 levels) in neighbor_count': undefined method []' for nil:NilClass(NoMethodError)

第35行是上面的行.compact.sum

1 个答案:

答案 0 :(得分:1)

零值只是疾病的症状。不要治疗症状,摆脱问题!这是你违反数组边界的。

.each_with_index枚举从第一个到最后一个的所有索引。因此,最后一个索引上的idx + 1将触发这种越界情况。第一个idx - 1会产生意外值而不是错误,这会影响您的计算。祝你好运调试。 :)

在你的代码中加入一些警卫检查,以确保你永远不会超出界限。

为了绝对清楚,问题不在于grid[idx + 1][idx2]是零并且弄乱了你的计算。 grid[idx + 1] 是零!当然,你不能做nil[idx2]。这是错误。