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

时间:2015-01-03 20:35:19

标签: ruby arrays

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

数组如下所示:

@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的值更改为原始值,而不应该是

1 个答案:

答案 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)