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

我有一个值数组,当我打印哈希值时,我将其用作订单的参考。 我想修改数组,以便数组值“更漂亮”。 我想我只是复制或克隆数组,更改值,原始对象将保持未被控制。 但是(在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'] ## ['Stuff', 'things']## <-what??? 

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

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

为了完整性b [1]。资本化! 具有相同的效果,将所有三个arrays的第二个位置都大写

所以…大写结束时的爆炸是否会使它变得更加强大? 足够交叉到其他对象? 我知道其他方法,但这对我来说似乎非常奇怪。 我认为这与“浅版”有关。 建议最好的方法吗?

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字符串数组
  • Ruby中数组的深层副本
  • 如何在Ruby中创建对象的深层副本?