6

Ich bewerte Scala und habe ein Problem mit seinen unveränderlichen Sammlungen.Wie man Scalas unveränderliche Sammlungen hält unveränderliche Objekte

Ich möchte unveränderliche Sammlungen, die vollständig unveränderlich sind, durch alle enthaltenen Objekte, die Objekte, auf die sie verweisen, ad infinitum machen.

Gibt es eine einfache Möglichkeit, dies zu tun?

Der Code auf http://www.finalcog.com/immutable-containers-scala veranschaulicht, was ich zu erreichen versuche, und eine böse Arbeit (ImmutablePoint).

Das Problem mit der Problemumgehung ist, dass jedes Mal, wenn ich ein Objekt ändern möchte ich manuell eine neue Kopie erstellen muss. Ich verstehe, dass die Laufzeit Copy-on-Write implementieren muss, aber kann dies für den Entwickler transparent gemacht werden?

Ich nehme an, ich mache unwandelbare Objekte, wo Methoden den aktuellen Objektstatus ändern, aber alle anderen 'val' (und alle unveränderlichen Container) Verweise auf das Objekt behalten den 'alten' Status.

+0

Diese Arbeit könnte Sie interessieren: http://lamp.epfl.ch/~phaller/capabilities.html –

+0

Ausgezeichnetes Lesematerial, danke. – fadedbee

Antwort

9

Dies ist nicht möglich mit scala über ein bestimmtes Sprachkonstrukt, es sei denn, Sie haben das Idiom alle Ihrer Objekte sind unveränderlich, in diesem Fall kommt dieses Verhalten kostenlos!

Mit 2,8 haben named-Parameter "Copy Constructors" aus Lesbarkeitsgründen recht benutzerfreundlich gemacht. Aber du hast recht, das funktioniert als Copy-on-Write. Das Verhalten, nach dem du fragst, wo das "aktuelle" Objekt das einzige mutierte ist, geht völlig gegen die Art und Weise, wie die JVM funktioniert, leider (für dich)!

Eigentlich macht der Ausdruck "das aktuelle Objekt" keinen Sinn; wirklich meinst du "die aktuelle Referenz"! Alle anderen Referenzen (außerhalb des aktuellen lexikalischen Umfangs), die auf das gleiche Objekt verweisen, äh, zeigen auf das gleiche Objekt! Es gibt nur ein Objekt!

es ist daher einfach nicht möglich, dieses Objekt aus der Sicht des aktuellen lexikalischen Gültigkeitsbereiches änderbar zu sein scheint, aber unveränderlich für andere

+0

Danke für Ihre Antwort. Ja, ich meine die aktuelle Referenz. Ich denke, ich bin ein bisschen wollig, was ich mit dem Objekt meine. Wenn ich beispielsweise ein Buchhaltungssystem abstrahiere, ist ein Objekt, das ein Konto darstellt, ein einzelnes Objekt. Das Objekt kann jedoch mehrere Zustände durchlaufen haben. Ich möchte, dass unveränderliche Container das Objekt in dem "Zustand" referenzieren, in dem es zu dem Zeitpunkt existierte, als es in den Container gelegt wurde. In meiner Problemumgehung (die nur unveränderbare Objekte verwendet) würde das Konto durch eine Reihe von Objekten repräsentiert, die ein gemeinsames Feld account_id teilen. – fadedbee

+0

Zusammenfassend sieht es so aus, als ob ich unveränderliche Objekte den ganzen Weg hinunter verwenden muss. Vielen Dank für Ihre Zeit. – fadedbee

Verwandte Themen