克隆一个数组及其内容

Cloning an array with its content

我想复制一个数组,在不影响原始数组的情况下就地修改副本。此代码失败

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

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

您需要对数组进行深拷贝。

方法如下

Marshal.load(Marshal.dump(a))

这是因为您克隆的是数组而不是其中的元素。所以数组对象是不同的,但它包含的元素是相同的实例。例如,您也可以 a.each{|e| b << e.dup} 为您的案例

不确定,是否在其他地方得到了回答。尝试搜索但没有成功。

试试这个

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"

希望对您有所帮助。

试试这个:

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

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

您可以使用 map:

对数组的每个元素调用它,而不是对数组本身调用 clone
b = a.map(&:clone)

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

您可以使用#dup 创建对象的浅表副本,这意味着 "the instance variables of object are copied, but not the objects they reference." 例如:

a = [1, 2, 3]

b = a.dup

b # => [1, 2, 3]

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

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

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

array.map(&:itself)