我的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
来制作深层副本是不是一个好主意?
答案 0 :(得分:10)
newFreq
是freq
的浅表副本。这意味着存储在newFreq
内的每个引用都指向存储在freq
中的引用。您可以更改引用独立指向的位置(newFreq.name = newFreq.name.sub 'f','newF'
),但如果您调用一个方法来改变对象,则newFreq
和freq
都会受到影响。
答案 1 :(得分:8)
Object#clone
方法执行浅拷贝。您需要深层复制才能完成工作。
关注this link以了解Ruby中的深层复制。