克隆一个数组及其内容
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)
我想复制一个数组,在不影响原始数组的情况下就地修改副本。此代码失败
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)