闭包变量绑定问题

很典型的问题:

[scala toolbar=”false” light=”true”]
// 定义一个函数数组,里面容纳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]

通常的解决方案:

[scala toolbar=”false” light=”true”]
// 多一层抽象
scala> def set(i:Int) { fs(i) = () => i }

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

再看结果

[scala toolbar=”false” light=”true”]
scala> fs.foreach( f => println(f()))
0
1
2
3
[/scala]

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

[scala toolbar=”false” light=”true”]
scala> for(i <- 0 to 3) {fs(i) = () => i}
scala> fs(3)()
[/scala]

闭包变量绑定问题》上有2个想法

发表评论

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