Scala閉包
閉包是函數,它的返回值取決於此函數之外聲明一個或多個變量的值。考慮下麵的一塊使用匿名函數的代碼:
val multiplier = (i:Int) => i * 10
在這裡,在函數體中使用的唯一變量, i * 0, 為i,其被定義為一個參數的函數。現在,讓我們來看另一塊代碼:
val multiplier = (i:Int) => i * factor
有兩個自由變量的乘數:i和factor。其中一個i是一個正式函數參數。因此,它被綁定到一個新的值在乘數每次調用。然而,factor不是一個正式的參數,那麼這是什麼?讓我們增加一行代碼:
var factor = 3 val multiplier = (i:Int) => i * factor
現在,factor具有參考變量在函數之外,但為封閉範圍的變量。讓我們試試下麵的例子:
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 }
讓我們編譯和運行上麵的程序,這將產生以下結果:
C:/>scalac Test.scala C:/>scala Test muliplier(1) value = 3 muliplier(2) value = 6 C:/>
上麵的函數引用factor並讀取每個時間的當前值。如果函數冇有外部引用,那麼它就是封閉了自己。無需外部環境是必需的。