使用命令链和映射的流利 Groovy 语法

Fluent Groovy syntax using command chaining and maps

给定以下 Groovy 代码:

someMap = ['key':{ str -> println "SUCCESS: ${str}" }]
clos = { someMap }

以下都是打印SUCCESS: abc的合法方式:

clos(null)['key'] "abc"
clos null key "abc"
someMap['key'] "abc"

然而,这一个:

someMap key "abc"

抛出 groovy.lang.MissingPropertyException: No such property: key for class: ConsoleScript50.

如果 clos(null)someMap 都解析为 java.util.LinkedHashMap,那么为什么 clos null key "abc" 合法,而 someMap key "abc" 不合法?

因为翻译成someMap.key()...,并没有这样的方法(只有一个属性(via missing)。someMap.key "abc"也可以。

另一个调用转换为 clos(null).key("abc"),它首先取消对映射的引用,然后仅在结果上调用 call

def x = clos null key
assert x.is(someMap.key)

Groovy 将 someMap key "abc" 理解为 someMap(key).getAbc(),这是行不通的。你真的需要点:

someMap.key "abc"

或方括号

someMap['key'] "abc"

更新

It seems that Groovy will always disambiguate a token like key as a call parameter (i.e. someMap(key)) if it can.

是的,会的。

Only if that interpretation doesn't make sense does it instead interpret the token as a property (.key) or map dereference (['key']).

不,Groovy 总是将第二个参数理解为调用参数,没有点或括号。这个

function parameter

总是理解为

function(parameter) 

它没有 "precedence" object[key]

如果您继续添加没有点或括号的内容来消除歧义,Groovy 将根据自己的规则继续添加括号和点。这个:

gimme coffee with sugar and milk

理解为

gimme(coffee).with(sugar).and(milk)

还有这个:

clos null key 'abc'

将始终被理解为

clos(null).key('abc')