Scala中点和空格之间的区别

lin*_*le5 3 scala

用来从Scala中的对象调用函数之间的区别.和确切的区别是什么

由于某种原因,我会得到一些变化,例如:

scala> val l:List[Int] = 1::Nil
l: List[Int] = List(1, 2, 3)

scala> l foldLeft(0)((hd, nxt) => hd + nxt) 
<console>:13: error: Int(1) does not take parameters
       | foldLeft(1)((hd, nxt) => hd + nxt)
                    ^
scala>l.foldLeft(0)((hd, nxt) => hd + nxt)
res2: Int = 2
Run Code Online (Sandbox Code Playgroud)

(而且,当我在操作时,该操作的名称是什么?我一直试图找到.操作符的严格定义,但我不知道它的名字。)

V-L*_*amp 5

如果对象的被调用函数中没有参数,则用空格代替点称为“ 后缀表示法”,如果函数需要有参数则称为中缀表示法

Postix示例:l sum,相当于l.sum

中缀示例:l map (_ * 2),相当于l.map(_ * 2)

这些符号的问题在于,它们本质上在解释上更加模棱两可。数学上的经典示例:

  • 1 + 2 * 3 + 4不明确,取决于操作员的优先级。
  • 1。+(2。*(3)。+(4)只有一种有意义的解释。

因此,它不是一个不同的运算符,而是与点相同,只是容易产生歧义,这可能会导致语法错误(例如您的情况),或者在链接中缀运算符时导致更严重的逻辑错误。

实际上,您可以通过以下方式用前缀符号表示foldLeft:

(l foldLeft 0)((hd, nxt) => hd + nxt) 
Run Code Online (Sandbox Code Playgroud)

甚至

(0 /: l)((hd, nxt) => hd + nxt)
Run Code Online (Sandbox Code Playgroud)

where /:只是foldLeft的别名,并使用以Colon(:)结尾的运算符的唯一语义,这些语义被解释为l./:(0)(与通常情况相反)。