gpt4 book ai didi

scala - 了解 scala 中的中缀行为

转载 作者:行者123 更新时间:2023-12-02 00:44:19 25 4
gpt4 key购买 nike

不确定我是否应该在这里或 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(b) 等价于 a f b 的简单规则不再适用?

最佳答案

因为表达不明确。

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

An expression(of syntactic category Expr) may contain embedded underscore symbols _ at places where identifiers are legal. Such an expression represents an anonymous function where subsequent occurrences of underscores denote successive parameters.

由于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)

关于scala - 了解 scala 中的中缀行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24138013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com