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ます!

のような単純な割り当てnewFreq.name = 'newFrequency'は変更されませんfreq

これはこれが機能することになっている方法ですか?

編集:clone深いコピーを作成するために、構造体とオーバーロードの代わりにクラスを使用することは良い考えですか?

4

2 に答える 2

10

newFreqの浅いコピーですfreq。つまり、内部に格納されている各参照は、に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 に答える