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

时间:2012-09-19 20:51:17

标签: ruby object duplicates 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'] ##<-what?
b
=> ['Stuff', 'things']## <-what???

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

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

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

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

1 个答案:

答案 0 :(得分:8)

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!修改一个对象时,该对象属于三个不同的数组。

另见