繁体   English   中英

了解Scala中的中止行为

[英]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 _.baf(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM