2010-11-17 27 views
5

我在我的Ruby代碼的結構體,看起來有點像這個爲什麼String :: sub!()在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進行深度複製是一個好主意嗎?

回答

10

newFreqfreq的淺拷貝。這意味着存儲在newFreq內部的每個參考都指向存儲在freq中的對象。您可以獨立地更改參考點的位置(newFreq.name = newFreq.name.sub 'f','newF'),但如果您調用使對象發生變異的方法,則newFreqfreq都將受到影響。

參見http://en.wikipedia.org/wiki/Object_copy

8

Object#clone方法執行淺拷貝。您需要深拷貝才能完成工作。

請按照this link瞭解Ruby中的深層複製。