Не уверен, почему аргумент изменяется циклом while в Ruby - PullRequest
0 голосов
/ 09 февраля 2019

Очень ( очень, очень ) новичок в 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)

, но не знаю, почему!

1 Ответ

0 голосов
/ 09 февраля 2019

На последней итерации, когда 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...