2010-11-10 49 views
2

基本上,我已經有一個Ruby對象的實例,但想要更新我可以從yaml得到的任何實例變量。有一個to_yaml函數可以將我的對象轉儲到yaml。我正在尋找相反的東西。例如,my_obj.from_yaml(yaml_stuff)並讓它更新yaml中的實例變量。如何使用YAML更新已經實例化的Ruby對象?

我需要在我的from_yaml函數中使用YAML :: load並複製每個實例變量嗎?有沒有一個函數可以用來快速複製這些變量,而不需要太多打字,如果是這樣的話?

Ruby的yaml庫是否有一些東西已經存在,我可以將它傳遞給對象和yaml,它會做我想做的事情?

編輯爲清楚起見

這是一個簡單的對象,將存儲和加載非常簡單YAML兼容的類型,比如字符串和整數。

我最終什麼事做

雖然我回答這個問題,我想補充什麼,我終於實現了,我的對象猴補丁

class Object 

    def from_yaml(yml) 

    if (yml.nil?) 
     return 
    end 

    yml.instance_variables.each do |iv| 
     if (self.instance_variable_defined?(iv)) 
     self.instance_variable_set(iv, yml.instance_variable_get(iv)) 
     end 
    end 

    end 
end 

回答

1

你的問題還不夠清楚。你在說什麼課?什麼樣的YAML文件?你不能有一切序列化到和從YAML。

讓我們假設你的對象只有一組簡單的YAML兼容類型的實例變量,比如字符串,數字和符號。

在這種情況下,通常可以,寫from_yaml方法,這將YAML文件加載到的key->value雙哈希,通過它遍歷和更新命名keyvalue每個實例變量。這看起來有用嗎?如果確實如此,您是否需要編寫此類方法的幫助?

編輯:

沒有必要爲你保持你的對象狀態在哈希 - 你仍然可以使用實例變量和attr_accessors - 只需打開一個新的模塊(比如YamlUpdateable),實現一個from_yaml方法,這將從YAML反序列化的哈希中更新您的ivars,並將該模塊包含在您想要從YAML反序列化的任何類中。

+0

對不起,如果我不清楚。對象成員由非常簡單的YAML兼容類型組成。我不知道這個功能是否已經存在於ruby的yaml庫中,或者如果我需要做一些特殊的事情。這聽起來像我需要做一些特殊的事情。我可能需要將其作爲一個不同的問題發佈,但將實例數據存儲在散列中並使用method_missing更新數據會有好處嗎?然後,我可以只是在進出哈希。 – Justin 2010-11-10 19:04:11

+0

我喜歡它。謝謝! – Justin 2010-11-10 20:00:05

1

據我所知,沒有什麼能像包含在YAML庫本身中;它主要是用於轉儲和讀取數據,而不是保持最新的內存和磁盤。如果您打算將數據保存在內存中並且磁盤上的數據同步最簡單,那麼您是否考慮過數據持久性庫,如ActiveRecordStone

如果你仍然熱衷於使用YAML庫,並且假設你沒有許多不同的類來堅持下去,那麼只需編寫一個小的「更新器」方法來更新給定類的對象可能是有意義的一個類似的對象。或者你可以重寫你的應用程序,以確保你可以簡單地重新加載YAML中的所有對象而不必更新它們(即轉儲舊對象並創建新對象)。

另一個選擇是使用元編程來讀入對象的屬性並相應地更新它們,但這似乎很容易出錯並且很危險。

-1

你在找什麼是merge命令。

// fetch yaml file 
yml = YAML.load_file("path/to/file.yml") 

// merge variables 
my_obj.merge(yml) 
+0

它看起來不像對象類中有合併函數。雖然有一個用於散列類。 – Justin 2010-11-11 15:46:29

相關問題