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 功能,您可以以相同的方式对待方法

此页面的贡献者