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

mhs*_*ams 8 groovy closures

鉴于以下groovy功能:

def foo(List<String> params, Closure c) {...}
Run Code Online (Sandbox Code Playgroud)

方法调用将是:

foo(['a', 'b', 'c']) { print "bar" }
Run Code Online (Sandbox Code Playgroud)

但我想在函数调用中摆脱括号(List).就像是:

foo('a', 'b') { print "bar" }
Run Code Online (Sandbox Code Playgroud)

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

有什么建议吗?

Gre*_*rin 12

看到不可能完全实现你想要的东西(它是用Groovy文档编写的,你的具体案例是一个问题,不幸的是他们正在迁移文档所以我现在无法直接链接),这些内容如下:

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

foo('a', 'b') ({ println 'woot' })
Run Code Online (Sandbox Code Playgroud)

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


Vic*_*tor 7

我认为这只有在使用数组作为参数或可变长度参数列表时才有可能:

def foo(Object... params) {
    def closureParam = params.last()
    closureParam()
}

foo('a', 'b') { print "bar" }
Run Code Online (Sandbox Code Playgroud)

  • 这是我倾向于避免的解决方案,因为我将无法再控制参数类型。一个可以发送整数或其他对象而不是字符串。 (2认同)

Tob*_*bia 6

总有穷人的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}
...
Run Code Online (Sandbox Code Playgroud)

我只是半开玩笑.