Scala:为什么l1 ::: l2与l1.:::(l2)不相等?

时间:2014-05-22 03:34:35

标签: list scala

这是我的代码:

    val l1 = List(1,2,3)
    val l2 = List(4,5,6)
    val l1l2_1 = l1 ::: l2
    val l1l2_2 = l1.:::(l2)
    val l1l2_3 = l2.:::(l1)
    println(s"l1 = $l1 \nl2 = $l2 \nl1 ::: l2  = $l1l2_1 \nl1.:::(l2) = $l1l2_2 \nl2.:::(l1) = $l1l2_3 }")

这是输出:

l1 = List(1, 2, 3) 
l2 = List(4, 5, 6) 
l1 ::: l2  = List(1, 2, 3, 4, 5, 6) 
l1.:::(l2) = List(4, 5, 6, 1, 2, 3) 
l2.:::(l1) = List(1, 2, 3, 4, 5, 6) }

为什么l1 ::: l2与l1。:::(l2)不相等?

2 个答案:

答案 0 :(得分:4)

:结尾的运算符与其他运算符的处理方式不同。当与中缀表示法一起使用时,它们会反转它们的参数 - 在右侧的参数上调用该方法,并将左侧的参数用作参数。因此l1 ::: l2l2.:::(l1)相同。

答案 1 :(得分:1)

原因是Scala中的两个规则:
1. :运算符/方法是右关联的 2.运算符/方法关联性由运算符名称中的最后一个字符确定。

例如:
具有任意名称但以:

结尾的任何方法
def myMethod:(a: Any)

被视为:,因此x myMethod: y也是正确的关联,并执行y.myMethod:(x)

Read more in Programming in Scala book: Basic Types and Operations