[英]Understanding infix behavior in scala
不确定我应该在这里还是在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))
导致方法调用发生故障。
那为什么呢? 为什么在写af _.b
时af(b)
等于afb
的简单规则不再适用?
因为表达是模棱两可的。
从Scala(有些过时)的规范P94: http : //www.scala-lang.org/docu/files/ScalaReference.pdf
(语法类别Expr的)表达式可以在标识符合法的位置包含嵌入的下划线符号
_
。 这样的表达式表示一个匿名函数,其中下划线的后续出现表示连续的参数。
由于lst map _.toString
是合法表达式,因此自然可以将其评估为匿名函数,例如(x) => lst.map(x.toString)
。
您仍然可以使用大括号括起来的infix表达式,使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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.