++:运算符对列表做了什么?

时间:2014-06-21 03:59:47

标签: scala

好吧,Scala让我感觉非常密集。我发现文档非常难以理解 - 更糟糕的是,你不能谷歌“Scala ++:”这个术语,因为谷歌放弃了运算符条款!

我正在阅读一些代码并看到了这一行:

Seq(file) ++: children.flatMap(walkTree(_))  

但无法理解。 Seq的文档显示了三件事:

++
++:
++:  

后两个人超负荷做什么..某事。文档中的实际解释说它们与++做同样的事情。即,将一个列表添加到另一个列表。

那么,运营商之间的区别到底是什么?

4 个答案:

答案 0 :(得分:9)

当操作数是不同类型的集合时,

++++:会返回不同的结果。 ++返回与左侧相同的集合类型,++:返回与右侧相同的集合类型:

scala> List(5) ++ Vector(5)
res2: List[Int] = List(5, 5)

scala> List(5) ++: Vector(5)
res3: scala.collection.immutable.Vector[Int] = Vector(5, 5)

++:有两个重载版本仅出于实现原因。 ++:需要能够接受任何TraversableOnce,但为TraversableTraversableOnce的子类型)提供了一个重载版本以提高效率。

答案 1 :(得分:3)

只是为了确保:

方法名称末尾的冒号(:)会使调用颠倒过来。

让我们制作两种方法,看看会发生什么:

object Test {
  def ~(i: Int) = null
  def ~:(i: Int) = null //putting ":" in the tail!

  this ~ 1   //compiled
  1 ~: this  //compiled
  this.~(1)  //compiled
  this.~:(1) //compiled.. lol

  this ~: 1  //error
  1 ~ this   //error
}

因此,在seq1 ++: seq2中,++:实际上是seq2的方法。

编辑:正如@okiharaherbst所提到的,这称为正确的关联性

答案 2 :(得分:1)

除非您学习一些简单的规则及其优先级,否则Scala函数命名看起来会很神秘。

在这种情况下,冒号意味着该函数具有右关联性,而不是您在命令式语言中看到的更常见的左关联性。

++:List(10) ++: Vector(10)中的Vector(10).++:(List(10))不是列表中的运算符,而是一个名为的函数,即使它出现在其上左手边,即它与++相同并返回向量

现在List(10) ++ Vector(10)中的

List(10).++(Vector(10))现在在列表中调用了函数(左关联性),即它与{{1}}相同并返回列表

答案 3 :(得分:0)

  

运营商之间到底有什么区别??

Seq.++操作的列表类型。

def ++[B](that: GenTraversableOnce[B]): Seq[B]
def ++:[B >: A, That](that: Traversable[B])(implicit bf: CanBuildFrom[Seq[A], B, That]): That
def ++:[B](that: TraversableOnce[B]): Seq[B]

在" What is the basic collection type in Scala?"

中评论