在循环中,我创建了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值相同?
答案 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() }
在这两个变体中,闭包关闭的变量每次循环都会重新创建,因此您可以获得预期的结果