为什么Ruby Builder的XmlMarkup使用与groovys的NodeBuilder不同的语法

时间:2009-09-14 14:00:37

标签: ruby groovy metaprogramming

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的不同技术的精彩综述。我会投票给你但没有代表。

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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