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

时间:2015-09-29 10:20:35

标签: groovy

例如:

def m(arg, ...args) {
    println "arg: $arg"
    println "args: $args"
}

m('arg', k:'v')

输出:

arg:['k':'v']
args:['arg']

我认为正确的输出应该是

args:['arg']
arg:['k':'v']

1 个答案:

答案 0 :(得分:5)

Groovy对于map参数有一个特殊的排序规则,如果它们占据参数列表中的第一个位置

def fn(Map params, ...args) {
    println "params = $params and args = $args"
}

然后,使用以下方法调用方法:

fn(1, 2, 3, something:'else')

将打印:

params = [something:else] and args = [1, 2, 3]

Groovy对Closure参数也有特殊的排序规则,如果它们是最后一个参数:

def fn2(a, b, Closure cl) {
    cl(a, b)
}

然后,您可以在调用方法时将它们放在括号之外,即:

println fn2(1, 2) { a, b -> a + b } // prints 3

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