【问题标题】:Why does Ruby Builder's XmlMarkup use different syntax to groovys' NodeBuilder为什么 Ruby Builder 的 XmlMarkup 使用与 groovys 的 NodeBuilder 不同的语法
【发布时间】:2009-09-14 14:00:37
【问题描述】:

Groovys 的 NodeBuilder 使用

def someBuilder = new NodeBuilder()

someBuilder.people(kind:'folks', groovy:true) {
  person(x:123,  name:'James', cheese:'edam') {
    project(name:'groovy')
    project(name:'geronimo')
  }
  person(x:234,  name:'bob', cheese:'cheddar') {
    project(name:'groovy')
    project(name:'drools')
  }
}

而 Rails 的 XmlMarkup 使用

xm = Builder::XmlMarkup.new
xm.instruct!                   # <?xml version="1.0" encoding="UTF-8"?>
xm.html {                      # <html>
  xm.head {                    #   <head>
    xm.title("History")        #     <title>History</title>
  }                            #   </head>
  xm.body {                    #   <body>
    xm.comment! "HI"           #     <! -- HI -->
    xm.h1("Header")            #     <h1>Header</h1>
    xm.p("paragraph")          #     <p>paragraph</p>
  }                            #   </body>
}                              # </html>

为什么在 Rails 中您需要使用显式接收器 (xm) 而在 Groovy 中您可以省略它?我听说过 ruby​​ 中不喜欢 instance_eval,为什么 groovy 可以摆脱这种风格而 ruby​​ 却不能?

感谢fractious,刚刚读完那篇文章,它是您可以用于在 ruby​​ 中构建 DSL 的不同技术的精彩综述。我会投票给你,但还没有代表。

【问题讨论】:

    标签: ruby groovy metaprogramming


    【解决方案1】:

    这是一篇很好的博文,解释了您可能会采用的不同方法 implementing a DSL in ruby 以及每种方法的优缺点。

    【讨论】:

      【解决方案2】:

      这两个库有不同的语法,因为它们是不同的库,由(据我所知)不同的人用不同的语言实现,他们对如何实现用于写作的 DSL 有相似但不同的想法(以及其他事物)XML 文档。

      或者换句话说,它们是不同的,因为它们是不同的。我不知道更好的表达方式。

      值得注意的是,Builder 库与 Rails 没有特别的关系:它是一个作为 Ruby Gem 实现的库,可以在任何 Ruby 所在的地方使用,而不仅仅是在 Rails 中。

      【讨论】:

        【解决方案3】:

        对此没有一个答案,这是一个品味问题,仅此而已。 如果你问 Groovy 的 dsl 是否可以在 Ruby 中完成,那么可以使用 method_missing。

        【讨论】:

          【解决方案4】:

          你没有理由不能在 Ruby 中这样做。该库的作者根本没有。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-09-14
            • 1970-01-01
            • 2018-12-08
            • 2011-07-01
            • 2016-12-02
            • 2013-03-22
            相关资源
            最近更新 更多