复制的数组作为原始数据

时间:2017-02-24 15:11:42

标签: ruby

我目前正在一个类中的方法内工作。

我尝试复制我的数组:

fakearray = []
@puzzarray.each_index do |row|
    fakearray << @puzzarray[row]
end

fakearray = @puzzarray.clone

但是当我打印@puzzarray时,我注意到它保留了我为fakearray所做的所有更改。 fakearray的目的是将其用作克隆,以便在@puzzarray上运行代码之前检查我的代码是否有效,但无论如何它都会保留所有不良更改。有什么建议吗?

3 个答案:

答案 0 :(得分:0)

请查看dup的此文档,以替代您选择的clonedup。该链接中的该部分是对clonedup之间差异的描述。检查一下,看看这是否有助于你的情况。

答案 1 :(得分:0)

使用activesupport gem,您可以使用#deep_dup

a = ['asd']
deep_copy = a.deep_dup
deep_copy[0] << 'dsa' #=> "asddsa"
a #=> ["asd"]

否则你可以Marshal.load(Marshal.dump(a))

deep_copy = Marshal.load(Marshal.dump(a))
deep_copy[0] << 'dsa' #=> "asddsa"
a #=> ["asd"]

答案 2 :(得分:0)

我猜@puzzarray是一个包含(子)数组的数组。如果是这种情况,则此代码

fakearray = []
@puzzarray.each_index do |row|
    fakearray << @puzzarray[row]
end

确实创建了一个新数组,但它包含完全相同的子数组。根据文档,<<方法“将给定对象推送到此数组的末尾”。给定的对象,而不是副本。这应该是一种补救措施:

fakearray = []
@puzzarray.each_index do |row|
    fakearray << @puzzarray[row].dup
end

这是实现相同目标的更短途径:

fakearray = @puzzarray.map( &:dup )
相关问题