2

不确定我应该在这里还是在Programmers上问这个问题,但无论如何

在 Scala 中,可以使用中缀语法编写方法调用,即省略点和括号。

例如,您可以这样做:

lst foreach println // equivalent to lst.foreach(println)

自然地,人们会假设它lst map _.toString会被评估为lst.map(_.toString),这相当于lst.map(x$1 => x$1.toString)

但是lst map _.toString放入 repl 会产生一个令人惊讶的结果,它被评估为((x$1) => sList.map(x$1.toString))导致方法调用发生故障。

那为什么呢?为什么写作时不再适用简单的a.f(b)等价规则?a f ba f _.b

4

1 回答 1

5

因为表达不明确。

来自 Scala 的(有些过时的)规范 P94:http ://www.scala-lang.org/docu/files/ScalaReference.pdf

一个表达式(句法类别 Expr)可能_在标识符合法的地方包含嵌入的下划线符号。这样的表达式表示一个匿名函数,其中后续出现的下划线表示连续的参数。

由于lst map _.toString是一个合法的表达式,它自然可以被评估为一个匿名函数,如(x) => lst.map(x.toString).

您仍然可以通过大括号使用中缀表达式,使 Scala 编译器首先评估占位符函数。

scala> val lst = List(1,2,3,4,5)
lst: List[Int] = List(1, 2, 3, 4, 5)

scala> lst map { _.toString }
res43: List[String] = List(1, 2, 3, 4, 5)
于 2014-06-10T10:11:37.990 回答