Ruby:更改二维数组中的坐标而不更改列的所有值

时间:2016-09-21 03:51:21

标签: arrays ruby debugging multidimensional-array deep-copy

我迷糊了。在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"

0 个答案:

没有答案