2009-06-04 11 views
1

Warum kann ich nicht zu einem scala.collection.Map hinzufügen? Es scheint, dass diese trait ohne diese Funktionalität ziemlich nutzlos ist.scala collection.Map kann nicht hinzugefügt werden

Konnte sie nicht die Methode ++ in Iterable überschrieben und den Rückgabetyp auf Map reduziert haben?

P.S. Ich meine nicht, dass es veränderbar sein sollte, nur dass es in der Lage sein sollte, eine neue Map mit einer zusätzlichen Zuordnung (oder Mappings), die gleiche wie eine immutable.Map.

Antwort

6

Ich lasse die ursprüngliche Antwort unten, obwohl es ziemlich falsch ist, da ich die Frage nicht richtig verstanden habe.

Scalas gegenwärtige Kollektionsbibliothek erzwingt ziemlich viele verschiedene Hinzufüge-Methoden für veränderbare/unveränderliche, wahrscheinlich in der Hoffnung, im Quellcode klar zu machen, welche Art von Sammlung verwendet wird. Wie gesagt, wird dies in 2.8 überarbeitet, und diese Prämisse geht weg.

Daher bieten die abstrakten Klassen nicht die Methoden, an die Sie denken, weil sie für unveränderlich, aber nicht für veränderlich existieren können, und umgekehrt. Oder sie haben die gleiche Name, aber verschiedene Implementierungen.

Und daher wäre es unmöglich, sie in der Basisklasse bereitzustellen.

Aber darüber hinaus feststellen, dass, auf diese Weise, wenn Sie einen scala.collection.map erhalten, Sie können nicht es vermasseln, indem es als wandelbar Behandlung, wenn Sie eine unveränderliche empfangen, oder umgekehrt.

Und jetzt für die falsche Antwort. :)

Sie können (nein, Sie können nicht - der folgende Code verwendet scala.collection.imutable.Map).

scala> val x = Map(1 -> 'a', 2 -> 'b') 
x: scala.collection.immutable.Map[Int,Char] = Map(1 -> a, 2 -> b) 

scala> x ++ Map(3 -> 'c') 
res5: scala.collection.immutable.Map[Int,Char] = Map(1 -> a, 2 -> b, 3 -> c) 

scala> var y = x 
y: scala.collection.immutable.Map[Int,Char] = Map(1 -> a, 2 -> b) 

scala> y += (3 -> 'c') 

scala> y 
res7: scala.collection.immutable.Map[Int,Char] = Map(1 -> a, 2 -> b, 3 -> c) 

scala> x + (3 -> 'c') 
res8: scala.collection.immutable.Map[Int,Char] = Map(1 -> a, 2 -> b, 3 -> c) 
+0

Hmmmm. Es scheint mir, dass durch die Schaffung von zwei Typen, die beide Map heißen, beide Sammlungen erweitert werden.Map aber verhält sich ganz anders, die Scala-Bibliotheks-Ersteller haben bereits die Situation geschaffen, in der ich "vermasseln kann, indem man [etwas] als veränderlich behandelt, wenn [es] unveränderlich ist". Wenn sie das nicht wollten, sollten sie keinen gemeinsamen Supertyp haben! –

+0

Sie sind beide Karten in dem Sinne, dass sie beide Sammlungen sind, auf die mit Schlüsseln zugegriffen werden kann. Das ist eine Karte. Und wie du selbst herausgefunden hast, wurden die Klassen geschrieben, damit du dich nicht vermasselst. –

0

Meine Vermutung ist: Wenn Sie einige Sammlung haben und eine schreibgeschützte Map-Fassade für andere bereitstellen müssen, ist dieses Merkmal für den Job wie es ist geeignet. Wenn Sie dort Addition hinzufügen, wäre es kein orthogonaler Entwurf, da dann eine Nur-Lese-Map-Schnittstelle benötigt würde. Auf der anderen Seite, wenn die Operation ++ in der generischen Schnittstelle erforderlich ist, wäre sie nicht sowohl für veränderbare als auch unveränderliche Implementierungen geeignet. Z.B. Wenn die veränderbare Sammlung selbst bei der Addition zurückgegeben wird, wäre es nicht offensichtlich, was passiert, wenn man nur die Schnittstelle betrachtet.

+0

Aber die unveränderliche Map * definiert * einen ++ Operator! Das ist mein Punkt! Es gibt eine (neue) Karte mit dem hinzugefügten Mapping zurück. Wenn scala.collection.Map implizit eine unveränderliche Map ist, sehe ich nicht, warum es nicht die Funktionalität von eins haben kann. Schließlich werden sie den Predef kaum ändern, oder? –

+0

Tatsächlich, wie David Hall darauf hingewiesen hat, könnte meine Vermutung nicht halten. scala.collections.Map erbt von scala.collections.generic.MapTemplate, das die Operation "++" (unveränderlich) bereitstellt. Siehe auch Verfall Anmerkungen zu ++ Methoden in MutableMapTemplate (das von scala.collections.mutable.Map vererbt wird) –

+0

(Ich schaute auf 2,8 Svn Stamm Quellen) –

1

Die Scala Collections Bibliothek ist derzeit ziemlich fehlerhaft. 2.8 (fällig für die Veröffentlichung in einem Monat oder so) hat eine komplett überarbeitete Sammlungsbibliothek, von der ich glaube, dass sie das von Ihnen gesuchte Verhalten hat.

Verwandte Themen