我有一个数组,想要复制它,以便检查它是否已更改。
数组如下所示:
@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
以下是整个代码的链接:http://pastebin.com/1xzLx5ib
我需要帮助来弄清楚为什么垂直方法会将@old_table
的值更改为原始值,而不应该是
答案 0 :(得分:3)
这是因为外部数组是克隆的,而不是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)