【发布时间】:2017-12-30 19:48:23
【问题描述】:
我遇到了 Groovy 函数和闭包之间的不一致,这让我很困惑。
我可以定义一个带有签名def foo(Map kwargs=[:], ... varargs){...} 的函数,它几乎完全符合我的预期。它几乎需要我给出的每一个命名和未命名的论点。它也不需要参数并且可以正常工作。
我找不到类似的方法来定义具有相同签名的闭包。作为一个快速演示,当我运行以下四行时:
def foo(Map kwargs=[:], ...args ){"kwargs=${kwargs.toString()} args=${args.toString()}"}
def bar = { Map kwargs=[:], ...args -> "kwargs=${kwargs.toString()} args=${args.toString()}"}
println foo(1:1,2:2)
println bar(1:1,2:2)
我得到以下输出:
> groovy test.groovy
kwargs=[1:1, 2:2] args=[]
Caught: groovy.lang.MissingMethodException: No signature of method: test$_run_closure1.call() is applicable for argument types: (java.util.LinkedHashMap) values: [[1:1, 2:2]]
Possible solutions: any(), any(), doCall([Ljava.lang.Object;), any(groovy.lang.Closure), each(groovy.lang.Closure), any(groovy.lang.Closure) groovy.lang.MissingMethodException: No signature of method: test$_run_closure1.call() is applicable for argument types: (java.util.LinkedHashMap) values: [[1:1, 2:2]]
Possible solutions: any(), any(), doCall([Ljava.lang.Object;), any(groovy.lang.Closure), each(groovy.lang.Closure), any(groovy.lang.Closure)
at test.run(test.groovy:4)
与Groovy Version: 1.8.6 JVM: 1.8.0_131 Vendor: Oracle Corporation OS: Linux一起运行
我想编写一个闭包,它可以接受任意数量的命名或未命名参数,包括根本没有参数。这可能吗?
【问题讨论】:
-
警告,吹毛求疵:Groovy 没有命名参数——只有 Maps
标签: groovy closures variadic-functions