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

我的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
进行深层复制是一个好主意吗?     
已邀请:
newFreq
freq
的浅表副本。这意味着存储在
newFreq
内的每个引用都指向对象,作为存储在
freq
中的引用。你可以改变参考点的位置(
newFreq.name = newFreq.name.sub 'f','newF'
),但是如果你调用一个改变对象的方法,
newFreq
freq
都会受到影响。 另见http://en.wikipedia.org/wiki/Object_copy     
Object#clone
方法执行浅拷贝。您需要深层复制才能完成工作。 请点击此链接了解Ruby中的深层复制。     

要回复问题请先登录注册