我正在使用Groovy开发DSL,我遇到了以下问题。我有一个方法,它使用给定的参数对对象执行一些操作。
def run(x) {
[with:{ y -> foo(x,y) }]
}
run "thing" with "param" // evaluates to foo("thing","param")
现在,假设我想为我的DSL添加默认功能:
def runDefault(x) {
foo(x)
}
runDefault "thing" // evaluates to foo("thing")
有没有办法将两者合并为一个函数,以便with "param"
部分成为可选子句?我希望能够使用DSL,如下所示:
run "thing" with "param" // should do foo("thing","param")
run "thing" // should do foo("thing")
答案 0 :(得分:1)
如果你能够在run-method中区分两个调用,你可以这样做:
def run(x) {
switch (x) {
case 'foo':
println "foo($x)"; break;
case 'bar':
[with:{ y -> println "bar($x,$y)" }]; break;
}
}
run "bar" with "param"
run "foo"