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
廣告