克隆数组获得与原始数组相同的值

Cloned array gets the same value as original

我有一个数组,想复制它以便检查它是否已更改。

数组如下所示:

@table = [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]

然后我像这样复制值:

@old_table = @table.clone

我有两种排序方式,一种是水平排序,一种是垂直排序。

水平方法一切正常,但当我使用垂直例程时,它会将 @old_table 的值更改为克隆数组。

我已经检查过对象 ID,它不一样。我也尝试过其他方法来复制值,但我得到了相同的结果。

水平:

currline = 0
4.times do
  @line = @table[currline].clone.reverse
  compare
  sort
  @table[currline] = @line.reverse
  currline += 1
end

垂直:

currline = 0
4.times do
  @line = [@table[0][currline],@table[1][currline],@table[2][currline],@table[3][currline]].reverse
  compare
  sort
  @line.reverse!
  @table[0][currline] = @line[0]
  @table[1][currline] = @line[1]
  @table[2][currline] = @line[2]
  @table[3][currline] = @line[3]
  currline += 1
end

这是整个代码的 link:http://pastebin.com/1xzLx5ib

我需要帮助来弄清楚为什么 vertical 方法将 @old_table 的值更改为原来的值,而这不应该。

因为克隆了外层数组,没有克隆4个内层数组。

@table = [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]
@old_table = @table.clone
@old_table.object_id
# => 70198498995020 
@table.object_id
# => 70198498975440 (So far so good)

@old_table[0].object_id
# => 70198498975520 
@table[0].object_id
# => 70198498975520 (Same row id!)

解决这个问题的一个简单方法是序列化和反序列化数组:

@old_table = Marshal.load Marshal.dump(@table)