1

我看到一个属性以不同的方式被访问,例如 .'@value' 和 .@value。有什么不同?

到底是什么报价在这里?

4

1 回答 1

3

你在哪里见过o.'@value'

调用o.@value将忽略对象中的 getter 并value直接获取属性。

所以调用o.'@value'会得到一个名为的属性@value(在 Groovy 中,它不是类的有效属性名称)

从示例编辑

啊,对,这是一个解释得很糟糕的例子,恕我直言。当 slurping xml 时,@attr表单是一个特殊的表单,会访问节点的一个属性。

现在 groovy 允许您执行以下操作:

def a = [ 'a', 'b', 'c' ]

// Will call getBytes() on every string in the list
assert a*.bytes == [[97], [98], [99]]

// So will this!
assert a.bytes == [[97], [98], [99]]

正如您在第二个中看到的那样assert,我们没有展开点运算符*.,但它仍然可以工作并调用getBytes列表中的每个元素。

使用您链接到的 xml 示例,它正在执行以下操作:

records.car.findAll{ it.country.text() =~ '.*s.*a.*' }.'@make'

所以它在列表中的每个项目上调用“make”属性。如果没有引号:

records.car.findAll{ it.country.text() =~ '.*s.*a.*' }.@make

它会尝试获取makeArrayList 的属性(显然不存在)。

我想说一种不那么令人困惑的写作方式是:

records.car.findAll{ it.country.text() =~ '.*s.*a.*' }*.@make

因为这使发生的事情更加明显......

于 2013-06-20T08:04:20.673 回答