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要素配列である1つの要素を持つ配列であるためです。

これについて何か説明はありますか?Groovy 1.8.8または2.1.2を使用しています

4

1 に答える 1

2

バグではなく機能だと思います:p

クロージャー宣言の Object[] には、可変引数の特別な意味があります。

http://groovy.codehaus.org/Closures+-+Formal+Definitionから:

Groovy は、余分な引数を特別にサポートしています。クロージャは、Object[] 型の最後の引数で宣言できます。開発者がこれを行う場合、呼び出し時の余分な引数はすべてこの配列に配置されます。これは、可変数の引数をサポートする形式として使用できます。

listあなたの例では、クロージャーに渡された引数は、唯一の要素として含まれる新しい Object 配列で再びラップされます。

例として:

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 に答える