2011-07-18 30 views
3

我有興趣從Yaml文件生成的散列創建對象。Ruby:從散列編程的方法

YAML的文件可能是這個樣子:

foos: 
    first: 
    code: f 
    name: The First Foo 
    icon: path/to/file.png 
    second: 
    code: s 
    name: The Second Foo 
    icon: path/to/file.png 
bars: 
    dive: 
    code: d 
    name: Dive Bar 
    location: 100 Main St. 
    college: 
    code: c 
    name: College Bar 
    location: 100 University Ave. 

因此,YAML文件基本上定義了一套屬於類別屬性。 這些類別有一個名稱(foos,bars),每個屬性至少有一個代碼和一個名稱。

所以,我希望能夠做的是創建一個「屬性」模型,將類別名稱轉換爲可以將該類別中的項目作爲簡單對象調用的方法。

我希望能夠做這樣的事情:

Attributes = Attributes.new(...yaml_file...) 
Attributes.foos #returns an array of foos 
Attributes.foo(:f) #returns the foo with a code (f) 
Attributes.foo(:s).name #returns "The Second Foo" 

我有點失去了對如何處理這個。

我知道如何設置我的屬性模型以將散列加載到實例變量中,但我不知道如何做的是使用該散列中的鍵創建爲鍵指定的方法,並通過對每個類別的單個項目創建對象的散列,這樣我就可以用點語法將它們鏈接起來。

我知道,與哈希我已經可以做

attributes[:foos][:first][:icon] 

但我想利用這個模型從哈希作爲一個起點,我可以添加其他有用的方法來屬性型號稍後。另外,我對ruby相當陌生,我真的很想學習如何做這樣的事情,只是爲了這樣做。

感謝您的幫助!

+0

你有沒有考慮過使用[Struct](http://ruby-doc.org/core/classes/Struct.html)來構建你的類? –

+0

是的,我正在考慮......不太熟悉Structs或它們是如何工作的...... – Andrew

回答

1

假設您的模型被處理並存儲在散列哈希中,那麼您可以使用method_missing來實現您的方案。這是一個非常粗略的草圖:

class Attributes { 
    def init(*args) { 
    @hash = # .... 
    } 
    def method_missing(symbol, *args) 
    result = @hash[symbol] 
    if (result && args.length) { 
     return result[args[0]] 
    } 
    return result 
    } 
}