在一个循环中,我创建了 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/