Red*_*Red 10 ruby clone copy object
我想制作一个数组的副本,以便原位修改副本,而不会影响原始数据.此代码失败
a = [
'462664',
'669722',
'297288',
'796928',
'584497',
'357431'
]
b = a.clone
b.object_id == a.object_id # => false
a[1][2] = 'X'
a[1] #66X722
b[1] #66X722
Run Code Online (Sandbox Code Playgroud)
副本应该与对象不同.为什么它只是一个参考?
jaz*_*ato 12
您需要对阵列进行深层复制.
这是实现它的方法
Marshal.load(Marshal.dump(a))
Run Code Online (Sandbox Code Playgroud)
这是因为您正在克隆数组而不是内部元素.因此数组对象是不同的,但它包含的元素是相同的实例.例如,a.each{|e| b << e.dup}你也可以为你的情况做
wjo*_*dan 10
clone您可以使用以下命令在每个数组的元素上调用它,而不是调用数组本身map:
b = a.map(&:clone)
Run Code Online (Sandbox Code Playgroud)
Zac*_*ite 10
您可以使用 #dup 创建对象的浅表副本,这意味着“复制对象的实例变量,但不复制它们引用的对象”。例如:
a = [1, 2, 3]
b = a.dup
b # => [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
来源:https://ruby-doc.org/core-2.5.3/Object.html#method-i-dup
编辑:听听我下面的保罗。我误解了这个问题。
试试这个:
b = [] #create a new array
b.replace(a) #replace the content of array b with the content from array a
Run Code Online (Sandbox Code Playgroud)
此时,这两个数组是对不同对象的引用,内容是相同的.