【发布时间】: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