【问题标题】:Fluent Groovy syntax using command chaining and maps使用命令链接和映射的流利 Groovy 语法
【发布时间】:2015-01-29 16:43:09
【问题描述】:

给定以下 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" 不合法?

【问题讨论】:

    标签: groovy closures fluent method-chaining


    【解决方案1】:

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

    someMap.key "abc"
    

    或方括号

    someMap['key'] "abc"
    

    更新

    如果可以的话,Groovy 似乎总是会消除像 key 这样的标记作为调用参数(即 someMap(key))的歧义。

    是的,会的。

    只有当这种解释没有意义时,它才会将标记解释为属性 (.key) 或映射取消引用 (['key'])。

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

    function parameter
    

    总是被理解为

    function(parameter) 
    

    它没有“优先于”object[key]

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

    gimme coffee with sugar and milk
    

    理解为

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

    还有这个:

    clos null key 'abc'
    

    将永远被理解为

    clos(null).key('abc')
    

    【讨论】:

    • 我是 Groovy 的新手,所以如果其中有任何错误,请告诉我:Groovy 似乎总是会消除像 key 这样的标记作为调用参数(即 someMap(key) ) 如果可以的话。只有当这种解释没有意义时,它才会将标记解释为属性 (.key) 或映射取消引用 (['key'])。在这种情况下,clos null key "abc" 有效,因为 clos(null)(key) 不是有效的语法,因此 Groovy 没有选择,只能将其消除歧义为 clos(null)['key']。正如您所指出的,someMap(key) 是有效语法,因此它优先于 someMap['key']
    【解决方案2】:

    因为它转换为someMap.key()...,并且没有这样的方法(只有一个属性(通过缺失)。someMap.key "abc" 也可以。

    另一个调用转换为clos(null).key("abc"),它首先取消引用到地图中,然后在结果上调用call

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

    【讨论】:

      猜你喜欢
      • 2011-05-10
      • 1970-01-01
      • 2010-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多