Dies ist unlogisch, da, wenn Infixoperatoren lesen sind von links nach rechts
Wenn man darüber nachdenkt, logisch, ist es viel Sinn macht. Die ::
(Nachteile) -Operator Prepends der Wert an den Anfang der Liste, es nicht append es an das Ende der Liste. Wenn man darüber nachdenkt, wie die, die Tatsache, dass der ::
Operator rechts assoziative macht Sinn, da es ein Element zu Beginn der List
klemmt:
scala> 4 :: List(3,2,1)
res1: List[Int] = List(4, 3, 2, 1)
Die interne Implementierung ist ziemlich einfach:
def ::[B >: A] (x: B): List[B] =
new scala.collection.immutable.::(x, this)
List
wird intern als LinkedList implementiert, die einen Kopf enthält, der das erste Element in der Sammlung ist, und eine Liste der verbleibenden Elemente, die das heck sind. Deshalb ist das Voranstellen des Elements viel billiger als das Anhängen, da es ein O (n) -Übergehen der internen Liste erfordern würde, um die Elemente zu kopieren, plus das Anhängen des neuen Wertes.
Obwohl teuer, können Sie immer noch mit den :+
Operator, der links assoziativ ist:
scala> List(1,2,3) :+ 4
res3: List[Int] = List(1, 2, 3, 4)
Mögliche Duplikat [Was gut sind rechtsassoziativ Methoden in Scala?] (Http: // stackoverflow.com/questions/1162924/what-good-are-right-associative-methods-in-scala) –