2012-08-28 69 views
1

我想知道發生了什麼。爲什麼OpenStruct值在其轉儲值的散列值發生變化時發生變化?

當我做到以下幾點:

new_struct = OpenStruct.new() 
new_struct.color = 'Red' 
new_struct.number = 4 

這導致:

#<OpenStruct color="Red", number=4> 

如果我再創建和更改一些PARAMS:

params = { first: new_struct.marshal_dump } 

params[:first][:color] = 'Orange' 

這將導致OpenStruct改變到:

#<OpenStruct color="Orange", number=4> 

爲什麼這個OpenStruct會改變,如果我改變參數散列?有沒有辦法改變params散列而不改變OpenStruct?

謝謝!

回答

2

這不是那麼意外,marshal_dump返回散列與OpenStruct對象的名稱空間,這是像任何其他散列一樣可變。如果你想阻止這一行爲,克隆它:

params = {first: new_struct.marshal_dump.clone} 
+0

謝謝,我覺得必須有一些原因。 OpenStruct是我的db中的一個列,它讓我感到驚訝,它正在發生變化。 – Lee

1

從marshal_dump()條目OpenStruct上紅寶石DOC:

規定由元帥庫使用編組的支持。 返回包含定義爲鍵和分配給它們的值的 函數的基礎哈希表。

您從marshal_dump()得到的散列實際上是OpenStruct的底層表示,因此散列中的任何更改都會反映在對象中。你總是可以克隆散列來解決這個問題。

+0

感謝您的解釋! – Lee

相關問題