为什么字符串::sub!()在Ruby中更改克隆对象的原始版本?

为什么字符串::sub!()在Ruby中更改克隆对象的原始版本?,ruby,clone,string-substitution,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!('

我的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

这就是应该的工作方式吗


编辑:使用类而不是结构并重载
克隆
来制作深度副本是一个好主意吗?

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

另请参见使用
对象#克隆
方法执行浅复制。您需要深度复制才能完成工作

下面了解Ruby中的深度复制