在 Groovy 3.0 中更改了对象字段访问的行为?

Changed behavior in object field access in Groovy 3.0?

我最近在协助迁移一些遗留代码时偶然发现了这个问题。

以下用于在 Groovy 2.4.x 中正确执行:

class Person {
  String name
}

def me = new Person( name : 'Joe' )

assert me.(name) == 'Joe'

而在 Groovy 3.0.2 上执行时引发异常:

groovy.lang.MissingPropertyException: 没有这样的 属性: class 的名称: MyScript

将 属性 名称括在括号中实际上对我来说是错误的:事实上,我很惊讶在旧版本中也没有引发异常。

我可能使用的语法是:

assert me.name == 'Joe'

或类似的东西:

assert me.'name' == 'Joe'

适用于 2.4 和 3.0 版本。

我做了一些研究,但在 Groovy 2.4 到 Groovy 3.0 的变更日志中找不到任何涉及可能影响此行为的内容。

我是不是漏掉了什么?

代码在 2.4 中运行的事实是否是意外行为,已得到纠正? 或者这是否真的有效?

我猜这与 3.0 版中切换到新的 Parrot 解析器有关。

谢谢!

当您将 属性 名称包裹在括号中时,例如“me.(name)”,您使用的是动态 属性 语法。 Groovy 应该在封闭范围内解析“名称”,而不是针对接收者。如果你想从“我”得到“名字”属性,你可以写“me.name”或“我.'name'”或“我['name']”或“me.getProperty('name')”。