无论DUP和克隆返回不同的对象,但修改它们改变了原来的对象(Both dup and clone r

2019-09-22 15:45发布

我有当我打印出的散列值,我作为顺序使用参考值的数组。 我想修改数组,使得数组的值是“漂亮”。 我想我只是DUP或克隆的阵列,更改值和原来的对象将保持unchanaged。 但是(在IRB)...

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

所以,在最起码,和@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! 具有相同的效果,大写所有三个阵列的第二位置

所以......就在利用年底的爆炸使它非常有力? 足以跨越到其它的目的?? 我知道这样做的其他方式,但这只是似乎非常奇怪了吧。 我认为这事做用是一个“浅拷贝”。 在最好的办法建议这样做吗?

Answer 1:

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中创建一个对象的深层副本?


文章来源: Both dup and clone return different objects, but modifying them alters the original object