【发布时间】:2018-01-28 23:20:42
【问题描述】:
我完成了井字游戏的训练,并且正在努力改进我的电脑播放器。这需要从旧板对象创建新板对象的副本。我在创建板的深层副本时遇到问题。
这里是有问题的代码:
Class Board
attr_accessor :grid
def initialize(grid = Array.new(3){ Array.new(3)})
@grid = grid
end
def place_mark(cords, sym)
self[cords] = sym
@grid
end
def [](pos)
row, col = pos
@grid[row][col]
end
def []=(pos, mark)
row, col = pos
@grid[row][col] = mark
end
def new_state
grid = @grid.dup
Board.new(grid)
end
end
board = Board.new
new_state = board.new_state # ==> A different object
new_state.place_mark([0,0], :X) # ==> Object with x placed at 0,0
board # ==> Object with x placed at 0,0
现在,当我实现一个 new_state 然后在 new_state 上放置一个标记时,它也会在复制它的状态上放置一个标记。
我明白为什么如果我只通过复制对象来设置我的 new_state 它将不起作用。但我不明白为什么我当前的实现不起作用。我应该存储当前对象的网格,然后使用相同的网格创建一个新对象。有什么想法吗?
【问题讨论】:
标签: ruby clone deep-copy tic-tac-toe dup