scala中:::和:::。()之间的区别是什么

时间:2013-05-08 14:26:51

标签: scala

在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)

(方法:::前缀列表)

2 个答案:

答案 0 :(得分:1)

我认为你在做什么 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:方法。

答案 1 :(得分: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