2013-05-08 70 views
3

在斯卡拉列表类的区别:::和:::(它表明:有什么区别)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)

(方法:::前缀列表)

回答

1

docs

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

+0

谢谢,澄清事情对我来说。 – Karthik 2013-05-20 16:28:04

1

我认为你正在做什么用 列表(1,2):: :(列表(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" 
      ^

你看到斯卡拉要调用右边的字符串对象的a:方法。