在 scala 列表类中显示:
List(1, 2) ::: List(3, 4) = List(3, 4).:::(List(1, 2)) = List(1, 2, 3, 4)
. 不应该:
List(1,2) ::: List(3,4) = List(1,2).:::(List(3,4)) = List(3,4,1,2)
(方法:::
前缀列表)
在 scala 列表类中显示:
List(1, 2) ::: List(3, 4) = List(3, 4).:::(List(1, 2)) = List(1, 2, 3, 4)
. 不应该:
List(1,2) ::: List(3,4) = List(1,2).:::(List(3,4)) = List(3,4,1,2)
(方法:::
前缀列表)
从文档:
def :::(prefix: List[A]): List[A]
[用例] 在此列表前面添加给定列表的元素。
例子:
List(1, 2) ::: List(3, 4) = List(3, 4).:::(List(1, 2)) = List(1, 2, 3, 4)
在 Scala 中,以 结尾的运算符:
是右结合的,调用对象出现在运算符的右侧。因为它是右关联的,所以该prefix
方法将在“向右”的对象上调用,即List(3, 4)
.
然后它会按照它的名字做,它会以 . 为前缀List(3, 4)
,List(1, 2)
这就是你得到. 的原因List(1, 2, 3 ,4)
。不是世界上最直观的东西,但它是这样的:
a ::: b
// ending in :, so flip the argument order, call the method on b.
b .:: a // :: = prefix b with a
result = a(concatenated) with b
现在让我们看一下右手边:
List(3, 4).:::(List(1, 2))
.
点正在执行:::
前缀调用的反转,因此它会在执行前缀操作之前简单地反转两个List
对象:::
。
List(3, 4).:::(List(1,2)) = List(1, 2) ::: List(3, 4) // exactly as the above.
// and now you it's the same story.
.
点是反转关联运算符的简单方法。a ::: b is the same as b .::: a
我认为您对 List(1,2).:::(List(3,4)) 所做的事情正在改变事物的顺序。
以 : 结尾使 scala 想要调用右侧对象上的方法。所以
a :: b
是真的
b.::(a)
明确使用点和括号时,您可以更改顺序。
不确定这个例子是否更清楚:
scala> class X() {
def `a:`(s: String): Unit = {
println(s)
}}
scala> var x = new X()
scala> x.`a:`("X")
X
scala> x `a:` "X"
<console>:10: error: value a: is not a member of java.lang.String
x `a:` "X"
^
你看到 scala 想要调用 a:
右边字符串对象的方法。