向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"

我正在用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")
是否有一种方法可以将这两个部分合并为一个函数,从而使带有“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)
这是否有问题?