闭包变量绑定问题

很典型的问题:

// 定义一个函数数组,里面容纳4个函数,类型为 ()=>Int
scala> val fs = new Array[()=>Int](4)

// 对数组中的每个函数赋值
scala> var i = 0
scala> while(i < 4)  { fs(i) = () => i; i=i+1}

// 执行每个函数
scala> fs.foreach( f => println(f()))
4
4
4
4

通常的解决方案:

// 多一层抽象
scala> def set(i:Int) { fs(i) = () => i }

// 重新对函数数组赋值
scala> var j=0
scala> while(j < 4) {set(j); j=j+1}

再看结果

scala> fs.foreach( f => println(f()))
0
1
2
3

在for表达式中呢?试试,不解释。

scala> for(i <- 0 to 3) {fs(i) = () => i}
scala> fs(3)()

闭包变量绑定问题》上有1条评论

  1. danny

    不明白 while(i i; i=i+1},为什么每个数组元素会绑定最新的值

    回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注