列表上的Groovy点表示法

And*_*rea 5 syntax groovy

我不理解Groovy中以下构造的目的.

每当你有一个东西的集合,调用它items,你可以只通过访问集合上的属性,即,,

items.prop == items.collect { it.prop }
Run Code Online (Sandbox Code Playgroud)

这对我来说很奇怪,因为我认为第一个符号实际上意味着我想要访问集合对象本身的属性.例如,可能会发生真实的歧义案例

[[1,2,3],['cat', 'elephant']].size == 2
Run Code Online (Sandbox Code Playgroud)

但根据之前的表示法,它应该是平等的[3, 2].

此外,如果收集符号不够短,则存在*.扩散点运算符,其意图以这种方式使用:

[[1,2,3],['cat', 'elephant']]*.size = [3, 2]
Run Code Online (Sandbox Code Playgroud)

模糊点符号的目的是什么?它是否只是为了节省字符而添加,*.或者它具有合法的使用情况,哪些*.不起作用并且collect会很麻烦?

Ted*_*eid 5

我不久前写了一篇名为“Groovy Spread OperatorOptional For Properties”的博文,深入探讨了这种情况下到底发生了什么。

简而言之,它更多的是语法糖,最终调用DefaultGroovyMethods.getAt(Collection, String)

它没有任何巨大的优势,但它可以使一些 DSL 更容易编写,因为无论对象是集合还是单个对象,它们都可以正确操作。

  • 是的,我已经读过你的帖子:-)但这并不能解释为什么人们首先应该想要这种行为。我觉得它非常令人困惑,所以我想听听一些关于为什么设计它的争论 (2认同)