位置:首页 > > Scala闭包

Scala闭包

闭包是函数,它的返回值取决于此函数之外声明一个或多个变量的值。考虑下面的一块使用匿名函数的代码:

val multiplier = (i:Int) => i * 10

在这里,在函数体中使用的唯一变量, i * 0, 为i,其被定义为一个参数的函数。现在,让我们来看另一块代码:

val multiplier = (i:Int) => i * factor

有两个自由变量的乘数:i和factor。其中一个i是一个正式函数参数。因此,它被绑定到一个新的值在乘数每次调用。然而,factor不是一个正式的参数,那么这是什么?让我们增加一行代码:

var factor = 3
val multiplier = (i:Int) => i * factor

var factor = 3 val multiplier = (i:Int) => i * factor

现在,factor具有参考变量在函数之外,但为封闭范围的变量。让我们试试下面的例子:

object Test {
   def main(args: Array[String]) {
      println( "muliplier(1) value = " +  multiplier(1) )
      println( "muliplier(2) value = " +  multiplier(2) )
   }
   var factor = 3
   val multiplier = (i:Int) => i * factor
}

让我们编译和运行上面的程序,这将产生以下结果:

C:/>scalac Test.scala
C:/>scala Test
muliplier(1) value = 3
muliplier(2) value = 6

C:/>

上面的函数引用factor并读取每个时间的当前值。如果函数没有外部引用,那么它就是封闭了自己。无需外部环境是必需的。