将可选子句添加到Groovy DSL

时间:2015-04-15 20:55:27

标签: 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"          // evaluates to foo("thing")

有没有办法将两者合并为一个函数,以便with "param"部分成为可选子句?我希望能够使用DSL,如下所示:

run "thing" with "param"    // should do foo("thing","param")
run "thing"                 // should do foo("thing")

1 个答案:

答案 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"