使用命令链和映射的流利 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')
给定以下 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')