克隆数组获得与原始数组相同的值
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)
我有一个数组,想复制它以便检查它是否已更改。
数组如下所示:
@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)