1

看到这个:

scala> 1 + 1
res0: Int = 2

scala> 1.+(1)
warning: there were 1 deprecation warning(s); re-run with -deprecation for details
res1: Double = 2.0

scala> "a" :: List()
res2: List[String] = List(a)

scala> "a".::(List())
<console>:8: error: value :: is not a member of String
              "a".::(List())
                  ^

为什么会发生错误?

4

3 回答 3

8

尝试这个

List().::("a")

原因是 :: 是 List 的一个方法。

ScalaByExample

与任何中缀运算符一样, :: 也被实现为对象的方法。在这种情况下,对象是扩展的列表。这是可能的,因为以 ':' 字符结尾的运算符在 Scala 中被特殊处理。所有此类运算符都被视为其右操作数的方法。例如,

x :: y = y.::(x) whereas x + y = x.+(y) 

但是请注意,二元运算的操作数在每种情况下都是从左到右计算的。因此,如果 D 和 E 是具有可能副作用的表达式,

D :: E 

被翻译成

{val x = D; E.::(x)}

为了保持操作数评估的从左到右的顺序。

于 2013-05-23T11:09:58.113 回答
1

:在以相反顺序应用的scala方法中。

所以当你写a::list它实际上是list.::(a). String 没有 :: 方法,所以解决方法是写List().::("a")或者Nil.::("a")

于 2013-05-23T11:10:05.227 回答
1

因为运算符优先级。在以 Scala 结尾的方法:是右关联的。所以你应该打电话List().::("a")

如果您想使用左关联方法,那么您应该编写 List("a") ++ List(),但这并不总是一个好的选择,因为它具有线性执行时间

于 2013-05-23T11:10:32.043 回答