Scala - 闭包



闭包是一个函数,其返回值取决于在此函数之外声明的一个或多个变量的值。

以下代码片段使用了匿名函数。

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

这里函数体中唯一使用的变量 i * 10 是 i,它被定义为函数的参数。尝试以下代码:

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

multiplier中有两个自由变量:ifactor。其中一个,i,是函数的形式参数。因此,每次调用multiplier时,它都会绑定到一个新的值。但是,factor不是形式参数,那它是什么呢?让我们再添加一行代码。

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

现在factor引用了函数外部但在封闭作用域中的变量。函数引用factor并在每次调用时读取其当前值。如果一个函数没有外部引用,那么它本身就是一个简单的闭包。不需要外部上下文。

尝试以下示例程序。

示例

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

将上述程序保存为Demo.scala。以下命令用于编译和执行此程序。

命令

\>scalac Demo.scala
\>scala Demo

输出

multiplier(1) value = 3
multiplier(2) value = 6
广告
© . All rights reserved.