提问人:u123 提问时间:3/3/2014 更新时间:11/9/2023 访问量:1987
迭代和打印 groovy 闭包的内容
Iterate and print content of 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 个闭包具有相同的值?
答:
5赞
tim_yates
3/3/2014
#1
是的,这让人们大吃一惊,自由变量绑定到 for 循环中的最后一个值,而不是创建闭包时的值。i
您可以将循环更改为基于闭包的调用:
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() }
在这两种变体中,每次循环时都会重新创建闭包闭合的变量,因此您可以获得预期的结果
评论