2011-07-29 213 views
0

我怎麼可以這樣做:紅寶石哈希樹塊

class MyClass 

    tile 'some title' 

    collection do 
    node1 'node1' 
    node2 'node2' 

     another_collection do 
     node1 'node1' 
     node2 'node2' 
     end 
    end 
    end_node 'some text' 

end 

及以下生產:

MyClass.build #=>{:title=>'some title',:collection=>{:node1=>'node1',:node2=>'node2',:another_collection=>{:node1=>'node1',:node2=>'node2'}},:end_node=>'some text'} 

我試圖是進行簡單的DSL和生成哈希樹。我確信可以通過method_missing和instance_eval完成,但我現在不會如何構建該邏輯。

感謝您的幫助

+1

你嘗試過這麼遠嗎?首先,嘗試僅處理一級方法調用,即首先使用無塊的封面使用。 –

+0

Mladen,謝謝你的回答。創建第一個節點和塊是很簡單的。只是在method_missing合併散列與方法名稱...問題是創建深嵌套樹節點... – alex

回答

7

在你method_missing,你應該檢查是否有塊,並給出了,如果是這樣,遞歸調用的主要方法吧:

class HashBuilder 

    def self.build &block 
    hb = HashBuilder.new 
    hb.instance_eval(&block) 
    hb.hash 
    end 

    attr_reader :hash 

    def initialize 
    @hash = {} 
    end 

    def method_missing meth, *args, &block 
    @hash[meth] = block ? HashBuilder.build(&block) : args.first 
    end 
end 

p HashBuilder.build{ 
    a :b 
    c :d 
    e do 
    f :g 
    end 
} 
#=> {:a=>:b, :c=>:d, :e=>{:f=>:g}} 
+1

謝謝男人。你真的幫我... – alex

+1

真棒回答 - 謝謝! –

+1

非常酷!沒想到答案如此之短。 –