例如:
def m(arg, ...args) {
println "arg: $arg"
println "args: $args"
}
m('arg', k:'v')
Run Code Online (Sandbox Code Playgroud)
输出:
arg:['k':'v']
args:['arg']
Run Code Online (Sandbox Code Playgroud)
我认为正确的输出应该是
args:['arg']
arg:['k':'v']
Run Code Online (Sandbox Code Playgroud)
如果Groovy在参数列表中占据第一个位置,则它对map参数有一个特殊的排序规则
def fn(Map params, ...args) {
println "params = $params and args = $args"
}
Run Code Online (Sandbox Code Playgroud)
然后,调用方法:
fn(1, 2, 3, something:'else')
Run Code Online (Sandbox Code Playgroud)
将打印:
params = [something:else] and args = [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
Groovy对Closure参数也有特殊的排序规则,如果它们是最后一个参数:
def fn2(a, b, Closure cl) {
cl(a, b)
}
Run Code Online (Sandbox Code Playgroud)
然后你可以在调用方法时将它们放在括号之外,即:
println fn2(1, 2) { a, b -> a + b } // prints 3
Run Code Online (Sandbox Code Playgroud)
因为你已经在所有参数上省略了类型,所以它只是将地图作为第一个参数