1

我在 groovy 的数组列表中遇到了每种方法的非常奇怪的行为。我已经给出了一段代码。

def list = [
    [2, "foo"].toArray(),
    [4, "bar"].toArray()
]

list.each { def row ->
    println(row.length)
}

这让我在控制台中得到了非常期待的结果

2
2

然后我对这段代码做了一些小的修改

def list = [
    [2, "foo"].toArray(),
    [4, "bar"].toArray()
]

list.each { Object[] row ->
    println(row.length)
}

结果是

1
1

因为变量行是具有一个元素的数组,这是我原来的列表中的 2 个元素数组。

对此有什么解释吗?我使用 groovy 1.8.8 或 2.1.2

4

1 回答 1

2

我想这是一个功能而不是一个错误:p

闭包声明中的 Object[] 对变量参数有特殊的语义:

来自http://groovy.codehaus.org/Closures+-+Formal+Definition

Groovy 对多余的参数有特殊的支持。闭包可以用它的最后一个 Object[] 类型的参数来声明。如果开发人员这样做,则在调用时任何多余的参数都将放置在此数组中。这可以用作支持可变数量参数的一种形式。

在您的示例中,传递给闭包的参数将再次用一个新的 Object 数组包装,该数组包含list作为唯一元素。

举个例子:

def list = [
    [2, "foo"].toArray(),
    [4, "bar"].toArray()
]

def c = {Object[] args -> println args}
c(list)

输出:

[[[2, foo], [4, bar]]]
于 2013-09-07T22:39:45.997 回答