迭代并打印groovy闭包的内容

时间:2014-03-03 11:36:13

标签: 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。为什么4个闭包的A值相同?

1 个答案:

答案 0 :(得分:1)

是的,this catches people out,自由变量i被绑定到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() }

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