Scala 3 — Book

函数变量

Language

从上一节回到这个例子:

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 函数式,您可以以相同的方式处理 方法

Contributors to this page: