下面是我的代码:
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)?
以:
结尾的操作符将被区别对待。当使用中缀表示法时,它们会反转它们的实参——在右边的实参上调用方法,而左边的实参用作形参。所以l1 ::: l2
和l2.:::(l1)
是一样的
Scala有两条规则:
1. :
运算符/方法是右结合的。
2. 操作符/方法的结合性由操作符名中的最后一个字符决定。
:
任何具有任意名称但以:
def myMethod:(a: Any)
被视为:
,因此x myMethod: y
也是右结合的,并且像y.myMethod:(x)
阅读更多关于Scala编程书:基本类型和操作