给定两个列表 a
和 b
,a ::: b
和 a ++ b
有什么区别?我怀疑其中一个运算符只是调用另一个,但实际上,它们的实现看起来完全不同:
def :::[B >: A](prefix: List[B]): List[B] =
if (isEmpty) prefix
else if (prefix.isEmpty) this
else (new ListBuffer[B] ++= prefix).prependToList(this)
override def ++[B >: A, That](that: GenTraversableOnce[B])
(implicit bf: CanBuildFrom[List[A], B, That]): That = {
val b = bf(this)
if (b.isInstanceOf[ListBuffer[_]])(this ::: that.seq.toList).asInstanceOf[That]
else super.++(that)
}
从使用角度来看,我应该选择a ::: b
还是a ++ b
?从实现的角度来看,这两个运算符之一不直接调用另一个的原因是什么?