::和+之间有什么区别:

时间:2013-03-05 23:34:58

标签: scala

scala> 3 :: List(1,2)
res5: List[Int] = List(3, 1, 2)

scala> 3 +: List(1,2)
res6: List[Int] = List(3, 1, 2)

这两个运营商之间的区别是什么?

2 个答案:

答案 0 :(得分:6)

不同之处在于+:::的抽象,它在广义Seq而非List s上运行。例如,+:也适用于Stream s:

scala> 3 +: Stream(1,2)
res0: scala.collection.immutable.Stream[Int] = Stream(3, ?)

List一起使用时,它在功能上与::相同。

答案 1 :(得分:0)

+:类定义的方法::List包含following implementations

override def +:[B >: A, That](elem: B)(implicit bf: CanBuildFrom[List[A], B, That]): That = bf match {
  case _: List.GenericCanBuildFrom[_] => (elem :: this).asInstanceOf[That]
  case _ => super.+:(elem)(bf)
}

def ::[B >: A] (x: B): List[B] =
  new scala.collection.immutable.::(x, this)

方法+:需要存在,因为它是从SeqLike继承而来的。正如pelotom所说,这是更普遍的方法。

但是,我不确定为什么方法List.::需要存在。

更新:同样的问题有already been asked。在评论中,建议方法::由于历史原因而存在。