[英]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 应该在封闭的 scope 中解析“名称”,而不是针对接收器。 如果要从“me”中获取“name”属性,可以写成“me.name”或“me.'name'”或“me['name']”或“me.getProperty('name') ”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.