Очень ( очень, очень ) новичок в Ruby, поэтому извиняюсь за этот ужасный код.
У меня есть следующий 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)
РЕДАКТИРОВАТЬ обновил код в соответствии с комментариями!К сожалению, сталкиваемся с другой проблемой.Я пытаюсь это затем выполнить цикл кода для каждого подмассива;
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)
, но не знаю, почему!