为什么“a”。::( List())报告错误“::不是字符串的成员”?

时间:2013-05-23 11:07:27

标签: scala

见:

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())
                  ^

为什么会出现错误?

3 个答案:

答案 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(),但这并不总是一个好的选择,因为它有线性执行时间