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的不同技术的精彩综述。我会投票给你但没有代表。
答案 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中这样做。该图书馆的作者根本没有。