使用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
答案 0 :(得分:1)
.each_with_index
枚举从第一个到最后一个的所有索引。因此,最后一个索引上的idx + 1
将触发这种越界情况。第一个idx - 1
会产生意外值而不是错误,这会影响您的计算。祝你好运调试。 :)
在你的代码中加入一些警卫检查,以确保你永远不会超出界限。
为了绝对清楚,问题不在于grid[idx + 1][idx2]
是零并且弄乱了你的计算。 grid[idx + 1]
是零!当然,你不能做nil[idx2]
。这是错误。