1. 程式人生 > >Scala中的閉包函式

Scala中的閉包函式

閉包是一個函式,返回值依賴於宣告在函式外部的一個或多個變數。

閉包通常來講可以簡單的認為是可以訪問一個函式裡面區域性變數的另外一個函式。

scala> def m1(x:Int) = x+y
<console>:11: error: not found: value y //這裡沒有定義y的值
       def m1(x:Int) = x+y
                         ^

scala> var y = 10 //定義一個自由變數
y: Int = 10

scala> def m1(x:Int) = x+y //定義一個自由變數之後,方法就能夠使用
m1: (x: Int)Int

這是因為我們在值函式外面聲明瞭一個全域性變數,然後值函式中的 y 捕獲到了這個全域性變數,從而使 x + y 變成一個正常的函式定義,讓函式的定義閉合起來,這就是閉包。如果改變 y 的值,閉包也可以捕獲到這個變化的 y 的值,例如讓 y = 15 之後再呼叫值函式 m1:

scala> var y = 15
y: Int = 15

scala> def m1(x:Int) = x+y
m1: (x: Int)Int

scala> m1(10)
res0: Int = 25

這樣定義的函式變數 m1 成為一個”閉包”,因為它引用到函式外面定義的變數,定義這個函式的過程是將這個自由變數捕獲而構成一個封閉的函式。

閉包還可以理解為:函式的巢狀,即:在一個函式定義中,包含另外一個函式的定義;並且在內函式中可以訪問外函式中的變數。

scala> def mulBy(factor:Double) = (x:Double) => x*factor
mulBy: (factor: Double)Double => Double
//第一個函式,接收一個double型別的引數,表示乘以多少倍
//第二個函式,是一個匿名函式,接收一個double型別的引數,並且內函式可以訪問外函式的引數

scala> val triple = mulBy(3)
triple: Double => Double = <function1>

scala> val half = mulBy(0.5
) half: Double => Double = <function1> scala> println(triple(10)+" "+half(8)) 30.0 4.0