Scala閉包


閉包是一個函式,它返回值取決於在此函式之外宣告的一個或多個變數的值。

以下程式碼是一個匿名函式。

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

這裡,函式體i * 10中使用的唯一變數是i,它被定義為該函式的一個引數。嘗試以下程式碼 -

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

乘數有兩個自由變數:ifactori是函式的一個正式引數。 因此,每當呼叫乘數時,它必然會有一個新的值。然而,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中,使用以下命令編譯和執行此程式。

D:\>scalac Demo.scala
D:\>scala Demo

multiplier(1) value = 3
multiplier(2) value = 6