我目前正在一个类中的方法内工作。
我尝试复制我的数组:
fakearray = []
@puzzarray.each_index do |row|
fakearray << @puzzarray[row]
end
和
fakearray = @puzzarray.clone
但是当我打印@puzzarray
时,我注意到它保留了我为fakearray
所做的所有更改。 fakearray
的目的是将其用作克隆,以便在@puzzarray
上运行代码之前检查我的代码是否有效,但无论如何它都会保留所有不良更改。有什么建议吗?
答案 0 :(得分:0)
请查看dup
的此文档,以替代您选择的clone
:dup。该链接中的该部分是对clone
和dup
之间差异的描述。检查一下,看看这是否有助于你的情况。
答案 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 )