2010-11-17 15 views
5

Ich habe eine Struktur in meinem Ruby-Code, die ein wenig wie diese späterWarum ändert String :: sub!() Das Original eines geklonten Objekts in Ruby?

Parameter = Struct.new(:name, :id, :default_value, :minimum, :maximum) 

aussieht, schaffe ich eine Instanz dieser Struktur

freq = Parameter.new('frequency', 15, 1000.0, 20.0, 20000.0) 

An einem gewissen Punkt mit, ich brauche eine exakte Kopie dieser Struktur, so nenne ich

newFreq = freq.clone 

Dann habe ich newFreq ändern den Namen

newFreq.name.sub!('f', 'newF') 

Die, wundersamerweise, ändert freq.name, auch! Eine einfache Zuweisung wie newFreq.name = 'newFrequency' ändert sich nicht freq.

Soll das so funktionieren?

Edit: Ist es eine gute Idee, eine Klasse anstelle einer Struktur zu verwenden und clone überladen, um eine tiefe Kopie zu machen?

Antwort

10

newFreq ist eine flache Kopie von freq. Das bedeutet, dass jede der in newFreq gespeicherten Referenzen auf das Objekt verweist, das in freq gespeichert ist. Sie können ändern, wo die Referenzen unabhängig zeigen (newFreq.name = newFreq.name.sub 'f','newF'), aber wenn Sie eine Methode aufrufen, die das Objekt verändert, sind sowohl newFreq als auch freq betroffen.

Siehe http://en.wikipedia.org/wiki/Object_copy

8

auch die Object#clone Methode führt flache Kopie. Sie benötigen tiefe Kopie, um die Arbeit zu erledigen.

Folgen Sie this link, um über tiefe Kopie in Ruby zu erfahren.