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

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

这两个运营商有什么区别?

4

2 回答 2

7

不同之处在于它+:是 的抽象::,它作用于广义Seqs 而不仅仅是Lists。例如,+:也适用于Streams:

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

当您将它与 a 一起使用时List,它在功能上与::.

于 2013-03-05T23:37:21.390 回答
0

类上定义的方法+:::定义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.::需要存在该方法。

更新:同样的问题已经被问过了。在评论中建议该方法的::存在是出于历史原因。

于 2013-03-06T07:50:01.740 回答