繁体   English   中英

Groovy 3.0 中 object 字段访问的行为是否改变?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM