特殊Groovy magic re属性访问和集合/可重用性?
我了解Groovy(2.4.3)中的扩展运算符特殊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
*。
的情况:
但是为什么把*
去掉会产生同样的结果呢
[].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测试似乎就是这样getFoo()样式的方法或带参数的方法时才有必要/有用?(因为您只需使用
即可。)
*。
适用于任何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