【问题标题】:Groovy: What happens when a closure's "owner" is another closure [duplicate]Groovy:当闭包的“所有者”是另一个闭包时会发生什么[重复]
【发布时间】:2016-10-02 22:23:20
【问题描述】:

我在 Groovy 中遇到了 owner 闭包的概念,这让我很困惑,所以我编写了一个小程序来弄清楚 owner 是如何工作的:

def examineClosure(closure) {
  closure()
}
examineClosure() {
    println "$owner"
    examineClosure() {
        println "$owner"
    }
}

不过,当我运行这段代码时,我得到了一个java.lang.StackOverflowError,我认为这是因为在内部闭包中评估$owner 时,Groovy 实际上是在外部闭包上隐式执行.call()。这是预期的行为吗?为什么结果与

不一样
examineClosure() {
    println "$owner"
    examineClosure() {
        println "" + owner
    }
}

据我了解,"some var: $var" 只是 "some var: " + var 的 Groovy 简写

【问题讨论】:

    标签: groovy


    【解决方案1】:

    使用 Groovy 的语法“$owner”的含义如下:将“所有者”变量值作为字符串插入“”部分。

    那是由于GString definition in Groovy.

    使用GString的一个例子可以如下:

    String $outerValue = "groovy GString syntax"
    
    "This is a String using $outerValue. it makes the String clear and more readable"."
    

    因此,我不确定您遇到的与关闭部分有关的错误。

    不幸的是,你的假设:

    我的理解是“some var: $var”只是 Groovy "some var:" + var 的简写形式

    错了。

    在以下代码中:

    examineClosure() {
        println "$owner"
        examineClosure() {
            println "" + owner
        }
    }
    

    变量owner根本没有定义。

    这就是你得到 java.lang.StackOverflowError 的原因。

    【讨论】:

    • 变量 thisownerdelegate 在 Groovy 中的任何闭包范围内隐式定义:groovy-lang.org/closures.html#closure-owner
    • 但是这一行: println "" + owner 表示 owner 是一个 String 或者实现了 toString() 方法,所以可以打印到屏幕上。而且我在您的代码中没有看到任何实现。当你有一个比它可以打印。
    猜你喜欢
    • 2011-08-17
    • 1970-01-01
    • 2014-06-20
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多