scala> 3 :: List(1,2)
res5: List[Int] = List(3, 1, 2)
scala> 3 +: List(1,2)
res6: List[Int] = List(3, 1, 2)
这两个运营商有什么区别?
scala> 3 :: List(1,2)
res5: List[Int] = List(3, 1, 2)
scala> 3 +: List(1,2)
res6: List[Int] = List(3, 1, 2)
这两个运营商有什么区别?
不同之处在于它+:
是 的抽象::
,它作用于广义Seq
s 而不仅仅是List
s。例如,+:
也适用于Stream
s:
scala> 3 +: Stream(1,2)
res0: scala.collection.immutable.Stream[Int] = Stream(3, ?)
当您将它与 a 一起使用时List
,它在功能上与::
.
类上定义的方法+:
和::
定义List
具有以下实现,
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.::
需要存在该方法。
更新:同样的问题已经被问过了。在评论中建议该方法的::
存在是出于历史原因。