Scala 閉包
閉包是一個函數,返回值依賴於聲明在函數外部的一個或多個變量。
閉包通常來講可以簡單的認為是可以訪問一個函數里面局部變量的另外一個函數。
如下面這段匿名的函數:
val multiplier = (i:Int) => i * 10
函數體內有一個變量i,它作為函數的一個參數。 如下面的另一段代碼:
val multiplier = (i:Int) => i * factor
在multiplier 中有兩個變量:i 和factor。 其中的一個i 是函數的形式參數,在multiplier 函數被調用時,i 被賦予一個新的值。 然而,factor不是形式參數,而是自由變量,考慮下面代碼:
var factor = 3 val multiplier = (i:Int) => i * factor
這裡我們引入一個自由變量factor,這個變量定義在函數外面。
這樣定義的函數變量multiplier 成為一個"閉包",因為它引用到函數外面定義的變量,定義這個函數的過程是將這個自由變量捕獲而構成一個封閉的函數。
完整實例
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 }
執行以上代碼,輸出結果為:
$ scalac Test.scala $ scala Test muliplier(1) value = 3 muliplier(2) value = 6