gpt4 book ai didi

ruby - dup 和 clone 都返回不同的对象,但是修改它们会改变原始对象

转载 作者:数据小太阳 更新时间:2023-10-29 06:59:11 26 4
gpt4 key购买 nike

我有一个值数组,在打印散列值时用作顺序引用。我想修改数组,使数组值“更漂亮”。我想我只是复制或克隆数组,更改值,原始对象将保持不变。然而(在 irb 中)...

@arr = ['stuff', 'things']
a = @arr.clone
b = @arr.dup

所以,至少,a 和@arr 是不同的对象:

a.object_id == @arr.object_id
=> false

但是现在变得奇怪了

a[0].capitalize!
a
=> ['Stuff', 'things']
@arr
=> ['Stuff', 'things'] ##<-what?
b
=> ['Stuff', 'things']## <-what???

好的...所以修改一个会改变其他的,让我们把它改回来?

a[0] = 'stuff'
a
=> ['stuff', 'things']
@arr
=> ['Stuff', 'things'] ## <- WHAT?????

为了完整性 b[1].capitalize!效果一样,三个数组的第二个位置都大写

那么...大写字母末尾的爆炸声是否使其更加有效?足以跨越到其他物体?我知道这样做的其他方法,但这对我来说似乎非常奇怪。我认为这与“浅拷贝”有关。有关执行此操作的最佳方法的建议?

最佳答案

dupclone 创建数组的新实例,但不是内容的新实例,它不是深拷贝。

参见:

array0 = ['stuff', 'things']
array1 = array0.clone
array2 = array0.dup

puts "Array-Ids"
p array0.object_id
p array1.object_id
p array2.object_id

puts "Object ids"
array0.each_with_index{|_,i|
p array0[i].object_id
p array1[i].object_id
p array2[i].object_id
p '--------'
}

数组中的元素共享相同的 object_id - 它们是相同的对象。数组具有不同的对象 ID。

当您a[0].capitalize! 时,您修改了一个对象,该对象属于三个不同的数组。

另见

关于ruby - dup 和 clone 都返回不同的对象,但是修改它们会改变原始对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12502715/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com