5

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

一个简单的赋值 likenewFreq.name = 'newFrequency'不会改变freq

这是应该的工作方式吗?

编辑:使用类而不是结构和重载clone来进行深层复制是个好主意吗?

4

2 回答 2

10

newFreqfreq. 这意味着存储在内部的每个引用都newFreq指向对象,就像存储在freq. 您可以单独更改引用指向的位置 ( ),但如果您调用改变对象的方法,newFreq.name = newFreq.name.sub 'f','newF'两者都会受到影响。newFreqfreq

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

于 2010-11-17T15:52:25.067 回答
8

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

按照此链接了解 Ruby 中的深层复制。

于 2010-11-17T16:04:29.887 回答