groovy - 迭代并打印常规闭包的内容

标签 groovy closures

在一个循环中,我创建了 4 个闭包并将它们添加到列表中:

closureList = []
for (int i=0; i<4; i++) {
    def cl = {
        def A=i;
    }
    closureList.add(cl)
}
closureList.each() {print  it.call()println "";};

这会产生以下输出:

4
4
4
4

但我本来期望的是 0,1,2,3。为什么 A 的 4 个闭包具有相同的值?

最佳答案

是的,this catches people out ,自由变量 i 绑定(bind)到 for 循环中的最后一个值,而不是创建闭包时的值。

您可以将循环更改为基于闭包的调用:

closureList = (0..<4).collect { i ->
    { ->
        def a = i
    }
}
closureList.each { println  it() }

或者创建一个额外的变量,每次循环时都会重新设置,并使用它:

closureList = []

for( i in (0..<4) ) {
    int j = i
    closureList << { ->
        def a = j
    }
}
closureList.each { println  it() }

在这两个变体中,每次循环都会重新创建由闭包关闭的变量,因此您可以获得预期的结果

关于groovy - 迭代并打印常规闭包的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22145763/

相关文章:

java - 如何匹配 Clojure 中的多行正则表达式来解析 Groovy 源文件?

javascript - Node js 中的关闭未按预期工作

groovy - Groovy中链式功能方法的惰性评估

unit-testing - 使用闭包对 GORM 调用进行单元测试

克隆实体上的 java.util.ConcurrentModificationException

groovy - 从另一个方法调用方法抛出 java.lang.ClassFormatError : Illegal class name

collections - 从 groovy 中的嵌套列表中获取值

grails - 使用Groovy/Grails将结果集存储在单个数组中

javascript - JS 作用域/闭包如何传递参数

javascript - ES6闭包只有在我将其分配给变量后才能调用