groovy:如何将varargs和闭包同时传递给方法?

时间:2014-12-10 16:53:32

标签: groovy closures

给出以下groovy函数:

def foo(List<String> params, Closure c) {...}

方法调用将是:

foo(['a', 'b', 'c']) { print "bar" }

但是我想在函数调用中删除括号(List)。类似的东西:

foo('a', 'b') { print "bar" }

我无法将list参数更改为varargs,因为varargs只能是函数中的最后一个参数(这里的闭包是最后一个参数)。

有什么建议吗?

3 个答案:

答案 0 :(得分:11)

看到无法实现您想要的功能(在Groovy文档中使用您的特定案例是一个问题,不幸的是他们正在迁移文档,因此我无法直接链接现在),沿着这些方向做些什么:

def foo(String... params) {
    println params
    return { Closure c ->
        c.call()
    }
}

foo('a', 'b') ({ println 'woot' })

现在你需要将封闭物放在parantheses中,但你不再需要使用数组了..

答案 1 :(得分:5)

我认为只有使用数组作为参数或Variable-Length Argument List

才能实现这一点
def foo(Object... params) {
    def closureParam = params.last()
    closureParam()
}

foo('a', 'b') { print "bar" }

答案 2 :(得分:5)

总是穷人的Varargs™

def foo(String p1,                                  Closure c) {foo [p1],             c}
def foo(String p1, String p2,                       Closure c) {foo [p1, p2],         c}
def foo(String p1, String p2, String p3,            Closure c) {foo [p1, p2, p3],     c}
def foo(String p1, String p2, String p3, String p4, Closure c) {foo [p1, p2, p3, p4], c}
...

我只是半开玩笑。