2010-11-17 45 views
5

我在我的Ruby代码的结构体,看起来有点像这个为什么String :: sub!()在Ruby中更改克隆对象的原始内容?

Parameter = Struct.new(:name, :id, :default_value, :minimum, :maximum) 

后,我创建使用

freq = Parameter.new('frequency', 15, 1000.0, 20.0, 20000.0) 

在某一点上的这种结构的情况下,我需要这样的精确副本结构,所以我打电话

newFreq = freq.clone 

然后,我改变newFreq的名字

newFreq.name.sub!('f', 'newF') 

奇迹般地,它也改变了freq.name

newFreq.name = 'newFrequency'这样的简单任务不会改变freq

这是应该这样工作的方式?

编辑:使用类而不是结构和重载clone进行深度复制是一个好主意吗?

回答

10

newFreqfreq的浅拷贝。这意味着存储在newFreq内部的每个参考都指向存储在freq中的对象。您可以独立地更改参考点的位置(newFreq.name = newFreq.name.sub 'f','newF'),但如果您调用使对象发生变异的方法,则newFreqfreq都将受到影响。

参见http://en.wikipedia.org/wiki/Object_copy

8

Object#clone方法执行浅拷贝。您需要深拷贝才能完成工作。

请按照this link了解Ruby中的深层复制。