gpt4 book ai didi

groovy - 特殊的 Groovy 魔术重新属性访问和集合/可迭代对象?

转载 作者:行者123 更新时间:2023-12-05 00:59:19 26 4
gpt4 key购买 nike

我了解价差运算符 *. 在这里发生了什么在 Groovy (2.4.3) 中:

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

但是为什么离开 * out 产生相同的结果?
[].class.methods.name
=> [add, add, remove, remove, get, ...

我原以为这会被解释为访问 name java.lang.reflect.Method[] 的属性(property)返回者 methods所以是一个错误。但它似乎有效。然后进行了更多实验,因此请执行以下操作:
[*[].class.methods].name
=> [add, add, remove, remove, get, ...
([].class.methods.toList()).name
=> [add, add, remove, remove, get, ...

因此,似乎试图访问数组或列表的属性(甚至可能是 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 返回该(单个)属性 - 而不是来自元素的列表属性值。 )

    最佳答案

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

    对于方法,您需要使用 *..collect()
    另见:Groovy spread-dot operator

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

    关于groovy - 特殊的 Groovy 魔术重新属性访问和集合/可迭代对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30867653/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com