这个 Groovy 结构是做什么的,语法是如何工作的?

What is this Groovy construct do, and how does the syntax work?

在 Groovy 中进行一些数据驱动测试时,我 运行 陷入了困境 运行ge。如果重要的话,这是在 Spock 测试中。

我认为列表应该是这样工作的:

    def list = [[1, 2, 3],
                [4, 5, 6],
                [7, 8, 9]]

    println list[0]

产生:

[1, 2, 3]

我不小心做了这样的事情:

    def whut = [[1, 2, 3]
                [4, 5, 6]
                [7, 8, 9]]

    println whut[0]
    println whut

输出:

[null, null, null]
[[null, null, null]]

好的,我可以看到 Groovy 不喜欢没有逗号的声明 - 但它可以编译,那这是什么?

以下是这种语法真正让我感到震惊的地方:

    def inputz = [
            [1, 0.631226308, 0.631226308, 0.631226308, 1, 0, 0.240426243]
            [1, 0.312284518, 0.312284518, 0.312284518, 1, 1, 1          ]
            [3, 0.823506476, 0.31230335,  0.631237191, 1, 1, 0          ]
            [4, 0.934875788, 0.486395986, 0.66732053,  3, 2, 0.927654169]
            [4, 0.699869773, 0.234328294, 0.424739329, 3, 3, 1          ]
    ]

    println inputz[0]
    println inputz

产生以下结果:

[0.631226308, 1, 1, 1, 1, 1, 1]
[[0.631226308, 1, 1, 1, 1, 1, 1]]

我完全迷失在这里 - 我正在创建的 Groovy 结构是什么,为什么它从我的列表中输出这些看似 运行dom 的值?

谢谢,如果您为我的问题想出更具描述性的名称,我会更改它。

所以

def whut = [[1, 2, 3]
            [4, 5, 6]
            [7, 8, 9]]

创建一个列表 [1,2,3],访问元素 4、5 和 6(它们不存在)以提供包含三个空值的列表,然后访问此列表的元素 7、8 和 9空值(再次返回三个空值)

然后它将这个包含三个空值的列表包装在一个列表中

以这个例子:

[1, 0.631226308, 0.631226308, 0.631226308, 1, 0, 0.240426243]
[1, 0.312284518, 0.312284518, 0.312284518, 1, 1, 1          ]
....

它深入到:

[1, 0.631226308, 0.631226308, 0.631226308, 1, 0, 0.240426243]
[1, 0, 0, 0, 1, 1, 1]

给出第 1、0、0、0、1、1 和 1,最后得到

[0.631226308, 1, 1, 1, 0.631226308, 0.631226308, 0.631226308]

等等等等。

将其分解为一个更小的示例(在 groovysh 中):

> [[1,2][3,4]]
===> [[null, null]]

但是我们不需要额外的数组,所以我们可以展开这个:

> [1,2][3,4]
===> [null, null]

这实际上是一种列表索引,通常是这样的:

> [1,2][1]
===> 2

但是如果我们索引数组的末尾:

> [1,2][2]
===> null

事实证明,groovy 支持切片作为此语法的一部分(有关更多示例,请参见 http://groovy-lang.org/groovy-dev-kit.html#Collections-Slicingwiththesubscriptoperator),因此我们可以:

> [1,2,3][2,0]
===> [3, 1]

获取第 3 个元素后跟第一个元素。

但结合这两个事实:

> [1,2][3,4]
===> [null, null]

我们再次索引到数组的末尾,但是有一个切片,给我们两个空值。