带块的 ruby​​ 哈希树

发布于 2024-11-26 23:41:50 字数 591 浏览 0 评论 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 来完成,但我现在不知道如何构建该逻辑。

感谢您的帮助

how can I do this:

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

and produce following:

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

What i was trying is to make simple DSL and build hash tree. I'm sure that can be done with method_missing and instance_eval, but i don't now how to build that logic.

Thanks for help

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

醉梦枕江山 2024-12-03 23:41:50

在您的 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}}

In your method_missing, you should check if a block is given, and, if so, recursively call the main method with it:

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}}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文