使用其内容克隆数组

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

编辑:听听我下面的保罗。我误解了这个问题。


May*_*ini 6

试试这个:

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)

此时,这两个数组是对不同对象的引用,内容是相同的.

  • 这也不做深度复制...试试`a = [[1,2,[3,4]]]` (2认同)