加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

特殊的Groovy魔法重新属性访问和集合/迭代?

发布时间:2020-12-14 16:23:40 所属栏目:大数据 来源:网络整理
导读:我理解扩展运算符*在这里发生了什么.在Groovy(2.4.3): [].class.methods*.name= [add,add,remove,get,... 但为什么离开* out会产生相同的结果呢? [].class.methods.name= [add,... 我原本希望将其解释为访问方法返回的java.lang.reflect.Method []的name属
我理解扩展运算符*在这里发生了什么.在Groovy(2.4.3):

[].class.methods*.name
=> [add,add,remove,get,...

但为什么离开* out会产生相同的结果呢?

[].class.methods.name
=> [add,...

我原本希望将其解释为访问方法返回的java.lang.reflect.Method []的name属性,因此是一个错误.但似乎有效.然后进行了更多的实验,以下内容如下:

[*[].class.methods].name
=> [add,...
([].class.methods.toList()).name
=> [add,...

因此,似乎尝试访问数组或列表的属性(可能甚至是Iterable)实际上为列表的每个元素返回该属性的列表(如扩展运算符所示).

所以这让我想知道:

>这种行为记录在任何地方吗? (我在这里没有看到它例如:http://www.groovy-lang.org/operators.html并且在文档的其他地方没有看到它.)
>此行为是否仅适用于’属性'(即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返回该(单个)属性 – 而不是来自元素的list属性值.)

解决方法

这是GPath表达式记录(ish) here,是的,它只适用于属性. (关于如何在2008年开展工作,有一个旧的 blog post by Ted Naleid here)

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

另见:Groovy spread-dot operator

Better docs link(正如@NathanHughes在下面指出的那样

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读