转置数组内部的对象不反映更改

时间:2018-11-07 13:50:11

标签: arrays ruby

我正在为“四通”创建一个Grid类:我从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对象仍然具有分配为nil的state属性。 我找不到我犯错的地方,希望您能提供帮助。

2 个答案:

答案 0 :(得分:2)

  

我找不到我犯错的地方,希望您能提供帮助。

在这里

  square = column.pop

您要从列中删除单元格。仔细观察,您会看到受影响的列变小了。另外,要删除的单元格就是要修改的单元格,因此这就是为什么您永远看不到columns数组中的更改的原因。

答案 1 :(得分:0)

问题在这里:

@grid_columns = @grid_strings.transpose

@grid_columns@grid_strings不同的对象。更改一个不会更改另一个。

一种可能的替代方法是将grid_columns定义为引用相同对象的方法

def grid_columns
  @grid_strings.transpose
end

您还可以使用其他方法,但是在不知道您实际如何使用grid_columns的情况下,很难进一步提出建议。