【问题标题】:What is the Groovy truth of an empty closure?空闭包的 Groovy 真相是什么?
【发布时间】:2015-01-25 22:10:29
【问题描述】:

我正在尝试预测此代码在 Groovy 中的行为

userList.find { }

.find documentation

find 方法被调用并传递一个闭包时,它返回第一个元素,该元素评估闭包到Groovies 对true 的理解。 当 find 方法在没有任何参数的情况下被调用时,它会根据 Groovy 真理返回列表中与 true 匹配的第一个对象。

如果使用空闭包会发生什么?

  1. 它的计算结果是否为真,从而返回列表的第一个元素?
  2. 它是否总是评估为 false 并在遍历列表后返回 null
  3. 会像 .find() 那样表现吗?

【问题讨论】:

    标签: groovy closures


    【解决方案1】:

    来自Groovy Closures Formal Definition (Alternative Source):

    闭包总是有返回值。该值可以通过闭包主体中的一个或多个显式返回语句指定,或者如果没有显式指定返回,则作为最后执行的语句的值。如果最后执行的语句没有值(例如,如果最后一条语句是对 void 方法的调用),则返回 null。

    来自Groovy Truth

    对象引用
    非空对象引用被强制为真。
    ...

    assert !null
    

    这表明空闭包的返回值的真相总是假的,所以find 将永远找不到任何东西,因此可能会返回null

    【讨论】:

    • 所以三个问题的答案是:(1)“否”,(2)“是”,(3)“否,因为.find()使用了‘身份闭包’{it} . 因此,userList.find() 将在userList 中找到第一个“真实”值,而userList.find{} 将永远找不到任何东西。”
    • 感谢您的总结。 Jon 对常规事实的澄清清楚地表明 (2) 的答案是“是”,由于我对 (2) 的表述,对 (3) 的答案必须是“否”。
    • 所以你可能应该给他+15的上调。他一直非常耐心地等待着。 ;-)
    【解决方案2】:

    只有当你将此闭包委托给 Map 时,才没有“空闭包”的定义,那么 Map 保持为空:

    ​Map closureToMap(Closure c, Map attrs=[:]) {
        c.resolveStrategy = Closure.DELEGATE_FIRST
        c.delegate = attrs
        c()
        return attrs
      }
    
    def myEmptyClosure = {}
    assert closureToMap(myEmptyClosure).isEmpty()
    

    【讨论】:

      猜你喜欢
      • 2013-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-30
      相关资源
      最近更新 更多