为什么String :: sub!()会更改Ruby中克隆对象的原始内容?

时间:2010-11-17 15:46:51

标签: ruby clone string-substitution

我的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来制作深层副本是不是一个好主意?

2 个答案:

答案 0 :(得分:10)

newFreqfreq的浅表副本。这意味着存储在newFreq内的每个引用都指向存储在freq中的引用。您可以更改引用独立指向的位置(newFreq.name = newFreq.name.sub 'f','newF'),但如果您调用一个方法来改变对象,则newFreqfreq都会受到影响。

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

答案 1 :(得分:8)

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

关注this link以了解Ruby中的深层复制。