给定以下groovy函数:
def foo(List<String> params, Closure c) {...}
方法调用将为:
foo(['a', 'b', 'c']) { print "bar" }
但是我想在函数调用中去掉括号(List)。类似于:
foo('a', 'b') { print "bar" }
我不能将list参数更改为varargs,因为varargs只能是函数中的最后一个参数(这里闭包是最后一个)。有什么建议吗?
cbeh67ev1#
鉴于不可能完全实现您想要的功能(Groovy文档中写着您的特定情况是一个问题,不幸的是,他们正在迁移文档,所以我现在不能直接链接),那么可以按照以下方式进行操作:
def foo(String... params) { println params return { Closure c -> c.call() } } foo('a', 'b') ({ println 'woot' })
现在你需要把闭包放在parantheses中,但是你不需要再使用数组了。
vsaztqbk2#
我认为这只有在使用数组作为参数或Variable-Length Argument List:
def foo(Object... params) { def closureParam = params.last() closureParam() } foo('a', 'b') { print "bar" }
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} ...
我只是半开玩笑。
wr98u20j4#
切换到Kotlin ;- )
fun test(vararg s: String, c: ()->String) { println(s) println(c()) }
工作起来很有魅力。
4条答案
按热度按时间cbeh67ev1#
鉴于不可能完全实现您想要的功能(Groovy文档中写着您的特定情况是一个问题,不幸的是,他们正在迁移文档,所以我现在不能直接链接),那么可以按照以下方式进行操作:
现在你需要把闭包放在parantheses中,但是你不需要再使用数组了。
vsaztqbk2#
我认为这只有在使用数组作为参数或Variable-Length Argument List:
kb5ga3dv3#
总是有穷人的Varargs™
我只是半开玩笑。
wr98u20j4#
切换到Kotlin ;- )
工作起来很有魅力。