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

qcbq4gxm  于 2022-11-01  发布在  其他
关注(0)|答案(4)|浏览(184)

给定以下groovy函数:

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

方法调用将为:

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

但是我想在函数调用中去掉括号(List)。类似于:

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

我不能将list参数更改为varargs,因为varargs只能是函数中的最后一个参数(这里闭包是最后一个)。
有什么建议吗?

cbeh67ev

cbeh67ev1#

鉴于不可能完全实现您想要的功能(Groovy文档中写着您的特定情况是一个问题,不幸的是,他们正在迁移文档,所以我现在不能直接链接),那么可以按照以下方式进行操作:

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

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

现在你需要把闭包放在parantheses中,但是你不需要再使用数组了。

vsaztqbk

vsaztqbk2#

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

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

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

kb5ga3dv3#

总是有穷人的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}
...

我只是半开玩笑。

wr98u20j

wr98u20j4#

切换到Kotlin ;- )

fun test(vararg s: String, c: ()->String) {
    println(s)
    println(c())
}

工作起来很有魅力。

相关问题