见:
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())
^
为什么会出现错误?
答案 0 :(得分:8)
试试这个
List().::("a")
原因是::是List的方法。
来自 ScalaByExample :
与任何中缀运算符一样,::也被实现为一个方法 宾语。在这种情况下,对象是扩展的列表。这是 可能,因为处理以':'字符结尾的运算符 特别是在斯卡拉。所有这些运营商都被视为他们的方法 右操作数。例如,
x :: y = y.::(x) whereas x + y = x.+(y)
但请注意,二进制操作的操作数分别是 从左到右进行评估。所以,如果D和E是表达式 可能的副作用,
D :: E
被翻译为
{val x = D; E.::(x)}
为了维持操作数评估的从左到右的顺序。
答案 1 :(得分:1)
在以:
结尾的scala方法中,以相反的顺序应用。
所以当你写a::list
时,它实际上是list.::(a)
。 String没有:: method,因此解决方案是编写List().::("a")
或Nil.::("a")
答案 2 :(得分:1)
由于运营商优先权。在Scala中,以:
结尾的方法是右关联的。所以你应该致电List().::("a")
如果你想使用左关联方法,那么你应该写List(“a”)++ List(),但这并不总是一个好的选择,因为它有线性执行时间