克隆内容为

时间:2015-07-16 13:16:42

标签: ruby object copy clone

我想制作一个数组的副本,以便就地修改副本,而不会影响原始数据。此代码失败

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

副本应该与对象不同。为什么它只是一个参考?

6 个答案:

答案 0 :(得分:11)

您需要对阵列进行深层复制。

以下是这样做的方法

Marshal.load(Marshal.dump(a))

这是因为您正在克隆数组而不是内部元素。因此数组对象是不同的,但它包含的元素是相同的实例。例如,你可以为你的案件做a.each{|e| b << e.dup}

答案 1 :(得分:7)

您可以使用clone在每个数组元素上调用map,而不是在数组本身上调用b = a.map(&:clone)

>>> from course.models import Course
>>> course = Course.objects.get(pk=1)
>>> course.title
'test'
>>> course.title = "NameChange"
>>> course.title
'NameChange'
>>> course.save()
>>>

这适用于问题中所述的示例,因为您为数组中的每个元素获取了一个新实例。

答案 2 :(得分:6)

试试这个:

b = [] #create a new array 
b.replace(a) #replace the content of array b with the content from array a

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

答案 3 :(得分:3)

您可以只映射数组的元素。我相信这是迄今为止最干净的解决方案。

array.map(&:itself)

答案 4 :(得分:2)

您可以使用#dup创建对象的浅表副本,这意味着“对象的实例变量被复制,但它们引用的对象未被复制”。 例如:

sep = ""

来源:https://ruby-doc.org/core-2.5.3/Object.html#method-i-dup

答案 5 :(得分:-1)

不确定,如果在其他任何地方都有答案。尝试搜索但没有成功。

试试这个

current_array =["a", "b","c","d"]
new_array = current_array[0 .. current_array.length]
new_array[0] ="cool"

output of new_array
 "cool","b","c","d"

希望这有帮助。