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