Учитывая два списка 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
? С точки зрения реализации, существует ли конкретная причина, почему один из этих операторов не просто вызывает другой?
Возможный дубликат [Конкатенация списка Scala, ::: vs ++] (http://stackoverflow.com/questions/6559996/scala-list-concatenation-vs) –