问题描述
我最近在协助迁移某些旧代码时偶然发现了这个问题。
以下用于在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') “。