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

使用命令链和映射的流畅Groovy语法,groovy,closures,fluent,method-chaining,Groovy,Closures,Fluent,Method Chaining,给定以下Groovy代码: someMap = ['key':{ str -> println "SUCCESS: ${str}" }] clos = { someMap } 以下所有内容都是打印成功的合法方式:abc: 然而,这一点: someMap key "abc" 抛出groovy.lang.MissingPropertyException:没有这样的属性:类的键:ConsoleScript50 如果Closnell和someMap都解析为java.util.LinkedHas

给定以下Groovy代码:

someMap = ['key':{ str -> println "SUCCESS: ${str}" }]
clos = { someMap }
以下所有内容都是打印成功的合法方式:abc:

然而,这一点:

someMap key "abc"
抛出groovy.lang.MissingPropertyException:没有这样的属性:类的键:ConsoleScript50

如果Closnell和someMap都解析为java.util.LinkedHashMap,那么是什么使clos null键abc合法,而someMap键abc不合法?

因为它转换为someMap.key…,并且没有这样的方法,只有一个属性via missing。someMap.key abc也可以工作

另一个调用转换为closnull.keyabc,它首先解除对映射的约束,然后只调用对结果的调用

def x = clos null key
assert x.is(someMap.key)
因为它转换为someMap.key…,并且没有这样的方法,只有一个属性via缺失。someMap.key abc也可以工作

另一个调用转换为closnull.keyabc,它首先解除对映射的约束,然后只调用对结果的调用

def x = clos null key
assert x.is(someMap.key)
Groovy将someMap键abc理解为someMapkey.getAbc,这是行不通的。你真的需要点:

someMap.key "abc"
或方括号

someMap['key'] "abc"
更新

Groovy似乎总是会将类似令牌的键作为调用参数消除歧义,如someMapkey(如果可以的话)

是的,会的

只有当这种解释没有意义时,它才会将令牌解释为property.key或map dereference['key']

不,Groovy总是将第二个参数(不带点或paren)理解为调用参数。这个

function parameter
总是被低估为

function(parameter) 
clos(null).key('abc')
它的特点是不优先于对象[键]

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

gimme coffee with sugar and milk
理解为

gimme(coffee).with(sugar).and(milk)
还包括:

clos null key 'abc'
将始终被视为

function(parameter) 
clos(null).key('abc')
Groovy将someMap键abc理解为someMapkey.getAbc,这是行不通的。你真的需要点:

someMap.key "abc"
或方括号

someMap['key'] "abc"
更新

Groovy似乎总是会将类似令牌的键作为调用参数消除歧义,如someMapkey(如果可以的话)

是的,会的

只有当这种解释没有意义时,它才会将令牌解释为property.key或map dereference['key']

不,Groovy总是将第二个参数(不带点或paren)理解为调用参数。这个

function parameter
总是被低估为

function(parameter) 
clos(null).key('abc')
它的特点是不优先于对象[键]

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

gimme coffee with sugar and milk
理解为

gimme(coffee).with(sugar).and(milk)
还包括:

clos null key 'abc'
将始终被视为

function(parameter) 
clos(null).key('abc')

我是Groovy的新手,所以如果有任何错误,请告诉我:Groovy似乎总是会将类似令牌的键作为调用参数消除歧义,如果可以的话,也就是someMapkey。只有当这种解释没有意义时,它才会将令牌解释为property.key或map dereference['key']。在本例中,clos null key abc起作用,因为closnullkey不是有效的语法,所以Groovy别无选择,只能将其解释为closnull['key']。正如您所指出的,someMapkey是有效语法,因此它优先于someMap['key']。我是Groovy新手,所以如果有任何错误,请告诉我:Groovy似乎总是会将像key这样的令牌作为调用参数来消歧,即someMapkey(如果可以的话)。只有当这种解释没有意义时,它才会将令牌解释为property.key或map dereference['key']。在本例中,clos null key abc起作用,因为closnullkey不是有效的语法,所以Groovy别无选择,只能将其解释为closnull['key']。正如您所指出的,someMapkey是有效语法,因此它优先于someMap['key']。