2016-12-27 1 views
10

Ich bin etwas verwirrt über +: und :: Operatoren, die verfügbar sind.Listen in Scala - Plus Doppelpunkt vs Doppelpunkt Doppelpunkt (+: vs: :)

Es sieht so aus, als ob beide die gleichen Ergebnisse liefern.

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

scala> 0 +: res0 
res1: List[Int] = List(0, 1, 2, 3) 

scala> 0 :: res0 
res2: List[Int] = List(0, 1, 2, 3) 

Für meine Anfänger Augen Quellcode für beide Verfahren sieht ähnlich aus (plus-Doppelpunkt-Methode für Generika mit Verwendung von Builder Fabriken zusätzliche Bedingung hat).

Welche dieser Methoden sollte wann verwendet werden?

+0

Ein guter Anfang: versuchen Sie das gleiche mit 'Seq' anstelle von' List' ... –

Antwort

11

+: arbeitet mit jeder Art von Sammlung, während :: ist spezifische Implementierung für List. Wenn Sie die source für +: genau betrachten, werden Sie feststellen, dass es tatsächlich :: aufruft, wenn der erwartete Rückgabetyp List ist. Das liegt daran, dass :: für den Fall List effizienter implementiert wird: Es verbindet einfach den neuen Kopf mit der vorhandenen Liste und gibt das Ergebnis zurück, das eine Operation mit konstanter Zeit ist, im Gegensatz zum linearen Kopieren der gesamten Sammlung im generischen Fall +: .

+: auf der anderen Seite nimmt CanBuildFrom, so dass Sie Lust haben, können (wenn auch nicht so schön in diesem Fall sucht) Dinge wie:

val foo: Array[String] = List("foo").+:("bar")(breakOut) 

(Es ist ziemlich nutzlos in diesem speziellen Fall, wie Sie könnte mit dem benötigten Typ beginnen, aber die Idee ist, dass Sie einer Sammlung vorangehen und Elemente hinzufügen und deren Typ in einem "go" ändern können, um eine zusätzliche Kopie zu vermeiden.

Verwandte Themen