向Groovy DSL添加可选子句
我正在用Groovy开发一个DSL,遇到了以下问题。我有一个方法,它在给定参数的对象上执行一些操作向Groovy DSL添加可选子句,groovy,dsl,Groovy,Dsl,我正在用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"
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")
是否有一种方法可以将这两个部分合并为一个函数,从而使带有“param”的部分成为可选子句?我希望能够使用DSL,如下所示:
run "thing" with "param" // should do foo("thing","param")
run "thing" // should do foo("thing")
如果能够在run方法中区分两个调用,则可以执行以下操作:
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"
您可能需要一个不同的方法来运行无参数的run
,或者需要一个“capping方法”来执行调用(如标准构建器模式中的build()
),我得到的最接近的结果是向run返回的映射添加一个默认处理程序,该映射运行默认情况,即def run(x){[with:{y->foo(x,y)}].withDefault{k->foo(x)}
并被称为run“thing”\uu
如果在使用“param”调用run“thing”时同时调用foo(x,y)
和foo(x,y)
这是否有问题?