特殊Groovy magic re属性访问和集合/可重用性?

特殊Groovy magic re属性访问和集合/可重用性?,groovy,Groovy,我了解Groovy(2.4.3)中的扩展运算符*。的情况: 但是为什么把*去掉会产生同样的结果呢 [].class.methods.name => [add, add, remove, remove, get, ... 我本以为这会被解释为访问methods返回的java.lang.reflect.Method[]的name属性,因此这是一个错误。但它似乎奏效了。在进行了更多试验后,请执行以下操作: [*[].class.methods].name => [add, add, re

我了解Groovy(2.4.3)中的扩展运算符
*。
的情况:

但是为什么把
*
去掉会产生同样的结果呢

[].class.methods.name
=> [add, add, remove, remove, get, ...
我本以为这会被解释为访问
methods
返回的
java.lang.reflect.Method[]
name
属性,因此这是一个错误。但它似乎奏效了。在进行了更多试验后,请执行以下操作:

[*[].class.methods].name
=> [add, add, remove, remove, get, ...
([].class.methods.toList()).name
=> [add, add, remove, remove, get, ...
因此,它似乎试图访问数组或列表的属性(甚至可能是
Iterable
),实际上会为列表中的每个元素返回该属性的列表(正如扩展运算符所做的那样)

这让我想知道:

  • 这种行为是否有记录在案?(例如,我没有在这里看到它:也没有在文档的其他地方看到它。)

  • 此行为是否仅适用于“属性”(即遵循
    getFoo()
    命名约定的非arg方法)?一些快速GroovyConsole测试似乎就是这样

  • 因此,spread运算符是否仅在调用非
    getFoo()样式的方法或带参数的方法时才有必要/有用?(因为您只需使用
    即可。)

  • 更新:

    似乎是这样的,spread
    *。
    适用于任何
    Iterable
    ,而
    仅适用于集合。例如:

    class Foo implements Iterable {
        public Iterator iterator() { [Long.class, String.class].iterator() }
    }
    (new Foo())*.name
    => [java.lang.Long, java.lang.String]
    (new Foo()).name
    => groovy.lang.MissingPropertyException: No such property: name for class: Foo
    

    (我想这是一件好事:如果
    Iterable
    本身后来获得了一个同名的属性,那么代码将开始从
    Iterable
    -返回该(单个)属性,而不是从元素返回列表属性值。)

    这就是GPath表达式(ish),是的,它仅适用于属性。(有一个古老的说法是,要深入了解2008年它是如何运作的)

    对于方法,您需要使用
    *。
    .collect()

    另见:

    (正如下面@NathanHughes所指出的,

    中也有记录,这似乎比第一个链接更全面。
    class Foo implements Iterable {
        public Iterator iterator() { [Long.class, String.class].iterator() }
    }
    (new Foo())*.name
    => [java.lang.Long, java.lang.String]
    (new Foo()).name
    => groovy.lang.MissingPropertyException: No such property: name for class: Foo