【发布时间】:2016-08-25 22:19:09
【问题描述】:
我有一个方法可以返回一个简单的函数数组,这些函数只打印它们的订单号:
def buggyClosureFunction(amount: Int) = {
val functions = new Array[() => Unit](amount);
var i = 0;
while (i < amount) {
functions(i) = {()=>print(i + " ")}
i += 1;
}
functions
}
val wow = buggyClosureFunction(4);
wow.foreach(_());
这会打印 4 4 4 4。(所有函数都会打印它们引用的 i 的值。
我似乎无法更改我的方法,以便返回的函数打印 1 2 3 4。
我的一个尝试:
def goodClosureFunction(amount: Int) = {
val functions: = new Array[() => Unit](amount);
var i = 0;
val helper = (num: Int) => {
print(num);
}
while (i < amount) {
functions(i) = {()=>helper(i)()}
i += 1;
}
functions
}
但这仍然会打印 4 4 4 4。
【问题讨论】:
-
考虑这个
def closures(n: Int) = (0 until n) map (i => () => print(i + " ")),没有变量,没有意外的关闭问题。