在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:无此类属性:类的名称: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”属性,则可以编写“ me.name”或“ me.'name'”或“ me ['name']”或“ me.getProperty('name') “。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...