非常(非常非常),因此对这个糟糕的代码表示歉意。
我有以下2d数组;
test = [
['Z','M','Z','Z','Z'],
['Z','Z','M','M','Z'],
['Z','Z','M','Z','Z'],
['Z','Z','Z','Z','Z'],
['Z','M','Z','Z','M']
]
,我想返回数组中每个单元的相邻单元(最多8个)。我正在逐行尝试此操作,使用“ while”循环遍历每个子数组,直到遇到超出范围的索引。
我确定这是非常低效,愚蠢的,但是现在这就是我的头了!
当我按照下面的方法调用方法时,传递参数(test,0,4),它沿'x'索引正确地工作,但是我对为什么我的'y'参数感到困惑在第一个循环后从“ 4”变为“ 1”。
我想念什么?
def do_the_cells_in_one_row grid,x=0,y=0
while grid[y][x].nil? == false
puts "here's x: #{x} y: #{y}"
puts grid[y][x]
if (x-1).negative? == false
print grid[y][x-1]
print y
puts x-1
end
if (x-1).negative? == false && (y-1).negative? ==false
print grid[y-1][x-1]
print y-1
puts x
end
if (y+1) < grid.length && (x-1).negative? == false
print grid[y+1][x-1]
print y+1
puts x-1
end
if (y+1) < grid.length
print grid[y+1][x]
print y+1
puts x
end
if (y-1).negative? == false
print grid[y-1][x]
print y-1
puts x
end
if x+1 < grid[y].length
print grid[y][x+1]
print y
puts x+1
end
if y+1 < grid.length && x+1 < grid[y].length
print grid[y+1][x+1]
print y+1
puts x+1
end
if (y-1).negative? == false && (x+1) < grid[y].length
print grid[y-1][x+1]
print y-1
puts x+1
end
x += 1
end
end
do_the_cells_in_one_row(test,0,4)
EDIT 根据评论更新了代码!不幸的是,直接遇到另一个问题。我正在尝试通过每个子数组循环代码;
def do_every_row grid,x=0,y=0
while grid[y][x].nil? == false
do_the_cells_in_one_row(grid,x,y)
y += 1
end
end
出现以下错误
in `do_every_row': undefined method `[]' for nil:NilClass (NoMethodError)
但不确定为什么!
答案 0 :(得分:0)
在上一次迭代中,当Ruby尝试计算表达式grid[y][x].nil? == false
时,y超出边界y = 5
。当Ruby移至下一个串联方法时,由于grid[y] = nil
会引发错误,因此前一个表达式将解释为nil[x].nil? == false
。
在Ruby中,方法是在每个类中定义的,因此会发生错误,因为您尝试将Array类方法[]
与Nil对象一起使用(该对象是NilClass的实例,并且没有方法)。
一个简单的解决方案是将y与数组长度进行比较。在这种情况下,while y < grid.length