Scala閉包
閉包是一個函數,它返回值取決於在此函數之外聲明的一個或多個變量的值。
以下代碼是一個匿名函數。
val multiplier = (i:Int) => i * 10
這裏,函數體i * 10
中使用的唯一變量是i
,它被定義爲該函數的一個參數。嘗試以下代碼 -
val multiplier = (i:Int) => i * factor
乘數有兩個自由變量:i
和factor
。i
是函數的一個正式參數。 因此,每當調用乘數時,它必然會有一個新的值。然而,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