位置:首頁 > 高級語言 > Scala教學 > Scala閉包

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並讀取每個時間的當前值。如果函數冇有外部引用,那麼它就是封閉了自己。無需外部環境是必需的。