我正在为“四通”创建一个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
属性。
我找不到我犯错的地方,希望您能提供帮助。
答案 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
的情况下,很难进一步提出建议。