为什么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
进行深层复制是一个好主意吗?
没有找到相关结果
已邀请:
2 个回复
物崎巩
是
的浅表副本。这意味着存储在
内的每个引用都指向对象,作为存储在
中的引用。你可以改变参考点的位置(
),但是如果你调用一个改变对象的方法,
和
都会受到影响。 另见http://en.wikipedia.org/wiki/Object_copy
场竟矩喘崩
方法执行浅拷贝。您需要深层复制才能完成工作。 请点击此链接了解Ruby中的深层复制。