如果我用(arg,... args)定义方法,参数将反转

nwa*_*thi 2 groovy

例如:

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)

tim*_*tes 5

如果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)

因为你已经在所有参数上省略了类型,所以它只是将地图作为第一个参数