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

orb*_*ish 8 groovy spock

在Groovy中进行一些数据驱动的测试时遇到了一些奇怪的事情.如果重要,这是在Spock测试中.

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

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

    println list[0]
Run Code Online (Sandbox Code Playgroud)

生产:

[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

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

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

    println whut[0]
    println whut
Run Code Online (Sandbox Code Playgroud)

哪个输出:

[null, null, null]
[[null, null, null]]
Run Code Online (Sandbox Code Playgroud)

好吧,我可以看到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
Run Code Online (Sandbox Code Playgroud)

产生以下结果:

[0.631226308, 1, 1, 1, 1, 1, 1]
[[0.631226308, 1, 1, 1, 1, 1, 1]]
Run Code Online (Sandbox Code Playgroud)

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

谢谢,如果你想到我的问题更具描述性的名字,我会改变它.

tim*_*tes 10

所以

def whut = [[1, 2, 3]
            [4, 5, 6]
            [7, 8, 9]]
Run Code Online (Sandbox Code Playgroud)

创建一个列表[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          ]
....
Run Code Online (Sandbox Code Playgroud)

它深入到:

[1, 0.631226308, 0.631226308, 0.631226308, 1, 0, 0.240426243]
[1, 0, 0, 0, 1, 1, 1]
Run Code Online (Sandbox Code Playgroud)

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

[0.631226308, 1, 1, 1, 0.631226308, 0.631226308, 0.631226308]
Run Code Online (Sandbox Code Playgroud)

等等等等.


Com*_*uid 6

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

> [[1,2][3,4]]
===> [[null, null]]
Run Code Online (Sandbox Code Playgroud)

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

> [1,2][3,4]
===> [null, null]
Run Code Online (Sandbox Code Playgroud)

这实际上是一种列表索引,通常如下所示:

> [1,2][1]
===> 2
Run Code Online (Sandbox Code Playgroud)

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

> [1,2][2]
===> null
Run Code Online (Sandbox Code Playgroud)

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

> [1,2,3][2,0]
===> [3, 1]
Run Code Online (Sandbox Code Playgroud)

获得第三个元素后跟第一个元素.

但结合这两个事实:

> [1,2][3,4]
===> [null, null]
Run Code Online (Sandbox Code Playgroud)

我们再次索引超过数组的末尾,但是使用切片,给我们两个空值.