Groovy:当一个闭包的“所有者”是另一个闭包时会发生什么

时间:2016-10-02 22:23:21

标签: groovy

我在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简写

1 个答案:

答案 0 :(得分:0)

语法" $ owner"使用Groovy意味着以下内容:插入'所有者'变量值作为字符串进入" "部分。

GString definition in Groovy引起的原因。

使用GString的示例如下:

String $outerValue = "groovy GString syntax"

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

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

不幸的是,你的假设是:

  

我的理解是"一些var:$ var"简直就是Groovy   简写为"一些var:" + var

错了。

在以下代码中:

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

根本没有定义变量所有者

这就是你得到java.lang.StackOverflowError。

的原因