Scala 3 — 書籍

函數變數

語言

回顧上一節的這個範例

val doubledInts = ints.map((i: Int) => i * 2)

我們注意到表達式的這個部分是匿名函數

(i: Int) => i * 2

它之所以被稱為匿名,是因為它未指定給變數,因此沒有名稱。

不過,匿名函數(也稱為函數文字)可以指定給變數以建立函數變數

val double = (i: Int) => i * 2

這會建立一個名為 double 的函數變數。在此表達式中,原始函數文字位於 = 符號的右側

val double = (i: Int) => i * 2
             -----------------

新的變數名稱位於左側

val double = (i: Int) => i * 2
    ------

而函數的參數清單在此處以底線標示

val double = (i: Int) => i * 2
             --------

如同方法的參數清單,這表示 double 函數需要一個參數,一個名為 iInt。您可以在 REPL 中看到 double 的類型為 Int => Int,表示它需要一個 Int 參數並傳回一個 Int

scala> val double = (i: Int) => i * 2
val double: Int => Int = ...

呼叫函數

現在您可以這樣呼叫 double 函數

val x = double(2)   // 4

您也可以將 double 傳遞到 map 呼叫中

List(1, 2, 3).map(double)   // List(2, 4, 6)

此外,當您有其他函數類型為 Int => Int

val triple = (i: Int) => i * 3

您可以將它們儲存在 ListMap

val functionList = List(double, triple)

val functionMap = Map(
  "2x" -> double,
  "3x" -> triple
)

如果您將這些表達式貼到 REPL 中,您會看到它們有這些類型

// a List that contains functions of the type `Int => Int`
functionList: List[Int => Int]

// a Map whose keys have the type `String`, and whose
// values have the type `Int => Int`
functionMap: Map[String, Int => Int]

重點

這裡重要的部分是

  • 若要建立函數變數,只要將變數名稱指定給函數文字
  • 一旦您有了函數,您可以將它視為任何其他變數,例如,視為 StringInt 變數

而且,感謝 Scala 3 中改良的 Eta Expansion 功能,您可以用相同的方式處理方法

此頁面的貢獻者