Объекты внутри транспонированного массива не отражают изменения - PullRequest
0 голосов
/ 07 ноября 2018

Я делаю класс Grid для "Connect Four": я создаю массив строк из Square объектов, а затем создаю массив столбцов, вызывая метод transpose для массива строк:

class Grid
  Square = Struct.new(:state)

  def initialize
    @grid_strings = Array.new(6) { Array.new(7) {Square.new} }
    @grid_columns = @grid_strings.transpose
  end

И у меня есть метод, который помещает символ в конец выбранного столбца, изменяя атрибут state соответствующего Square экземпляра:

  def put_to_column(column_index, symbol)
    column = @grid_columns[column_index - 1]
    loop do
      square = column.pop
      raise "Full column" if square.nil?
      if square.state.nil?
        square.state = symbol
        break
      end
    end
  end

Проблема в том, что когда я несколько раз вызываю put_to_column, он корректно изменяет объекты square, но только в массиве @grid_strings. Если я проверю массив @grid_columns, все объекты square по-прежнему будут иметь атрибут state, назначенный для nil. Я не могу найти место, где я совершил ошибку, и надеюсь, что вы можете помочь.

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Я не могу найти место, где допустил ошибку, и надеюсь, что вы поможете.

Вот оно,

  square = column.pop

Вы удаляете клеток из столбца. Присмотритесь, вы увидите, что пострадавший столбец станет меньше. Кроме того, удаляемая ячейка является изменяемой, поэтому вы никогда не увидите изменений в массиве столбцов.

0 голосов
/ 07 ноября 2018

Проблема здесь:

@grid_columns = @grid_strings.transpose

@grid_columns и @grid_strings являются различными объектами . Изменение одного не изменит другого.

Возможным альтернативным подходом было бы определение grid_columns как метод , который ссылается на тот же объект:

def grid_columns
  @grid_strings.transpose
end

Существуют и другие подходы, которые вы также можете использовать, но, не зная, как вы на самом деле используете grid_columns, трудно посоветовать дальше.

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