我迷糊了。在my Ruby code中,我有一个二维点阵列,分配给战舰游戏中的实例变量:
@dotty_board =
[[".", ".", ".", ".", ".", ".", ".", ".", ".", "."],
[".", ".", ".", ".", ".", ".", ".", ".", ".", "."],
[".", ".", ".", ".", ".", ".", ".", ".", ".", "."],
[".", ".", ".", ".", ".", ".", ".", ".", ".", "."],
[".", ".", ".", ".", ".", ".", ".", ".", ".", "."],
[".", ".", ".", ".", ".", ".", ".", ".", ".", "."],
[".", ".", ".", ".", ".", ".", ".", ".", ".", "."],
[".", ".", ".", ".", ".", ".", ".", ".", ".", "."],
[".", ".", ".", ".", ".", ".", ".", ".", ".", "."],
[".", ".", ".", ".", ".", ".", ".", ".", ".", "."]]
现在如果这就是全部,我可以轻松输入
@dotty_board[5][5] = 'C'
print @dotty_board
我看到这样的事情,对吧?
[[".", ".", ".", ".", ".", ".", ".", ".", ".", "."],
[".", ".", ".", ".", ".", ".", ".", ".", ".", "."],
[".", ".", ".", ".", ".", ".", ".", ".", ".", "."],
[".", ".", ".", ".", ".", ".", ".", ".", ".", "."],
[".", ".", ".", ".", ".", ".", ".", ".", ".", "."],
[".", ".", ".", ".", ".", "C", ".", ".", ".", "."],
[".", ".", ".", ".", ".", ".", ".", ".", ".", "."],
[".", ".", ".", ".", ".", ".", ".", ".", ".", "."],
[".", ".", ".", ".", ".", ".", ".", ".", ".", "."],
[".", ".", ".", ".", ".", ".", ".", ".", ".", "."]]
事实上,我在一个小的Ruby测试文件中输入了这个。当然它的工作方式就是这样。
但是在我的游戏代码的上下文中,我有一个@dotty_board
变量,其中包含上述内容,我确认其类是Array。 (如果重要的话,我通过对实例对象的方法调用来创建它。但它不是实例对象;它是一个数组。)我可以精确地键入上面的两行,然后, ,我明白这一点:
[[".", ".", ".", ".", ".", "C", ".", ".", ".", "."],
[".", ".", ".", ".", ".", "C", ".", ".", ".", "."],
[".", ".", ".", ".", ".", "C", ".", ".", ".", "."],
[".", ".", ".", ".", ".", "C", ".", ".", ".", "."],
[".", ".", ".", ".", ".", "C", ".", ".", ".", "."],
[".", ".", ".", ".", ".", "C", ".", ".", ".", "."],
[".", ".", ".", ".", ".", "C", ".", ".", ".", "."],
[".", ".", ".", ".", ".", "C", ".", ".", ".", "."],
[".", ".", ".", ".", ".", "C", ".", ".", ".", "."],
[".", ".", ".", ".", ".", "C", ".", ".", ".", "."]]
每一行的第六个元素现在是一个C'而不仅仅是第六行。换句话说,在我将5,5的值更改为' C'之后,0到9,5的值也会更改为' C'。我尝试了很多测试和研究,但我无法弄明白。我才知道,当有人揭露这个秘密时,我会非常清楚地拍打我的前额。神圣的#!+可能会发生什么?有什么想法吗?
我已确认问题与我的@dotty_board
变量有关。我在测试代码中完全复制了我的测试代码,这些代码与@dotty_board
具有奇怪的效果。然后我@dotty_board
到@ditty_board
并将此新变量分配给您在上面看到的二维点阵列。好吧,ditty_board[5][5] = 'C'
在该上下文中完全按预期工作,它只更改一个坐标。
但是究竟有什么关于@dotty_board
(一个Array类对象)可能会让它有这种不同的行为呢?
答案如下。似乎我的数组初始化的方式不适合可能需要更新其值的数组。
我的一位朋友听到了我对问题和解决方案的总结,然后圣洁地点了点头,说道,"啊。 Deep vs. shallow copy"