红宝石哈希树与块

时间:2011-07-29 11:43:48

标签: ruby tree dsl block

我该怎么做:

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 :(得分:8)

method_missing中,您应该检查是否给出了一个块,如果是,则以递归方式调用main方法:

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}}