这是我的代码:
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)不相等?
答案 0 :(得分:4)
以:
结尾的运算符与其他运算符的处理方式不同。当与中缀表示法一起使用时,它们会反转它们的参数 - 在右侧的参数上调用该方法,并将左侧的参数用作参数。因此l1 ::: l2
与l2.:::(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