Scala hat etwas Unterstützung bei Kopierkonstruktoren, aber ich kenne keine zufriedenstellende Lösung für die Aktualisierung komplexer Objektstrukturen. Ich könnte etwas verpasst haben.
Die beste Implementierung, mit der ich experimentiert habe, ist die Datenlinse in Haskell. Haskell ist jedoch schwer zu lernen. Welche Möglichkeiten gibt es für populäre plattformübergreifende Programmiersprachen wie Java oder Scala?
Es gibt wirklich keine Notwendigkeit für die Unterstützung von Linsen auf Sprachniveau - obwohl sie natürlich abhängig von den Eigenschaften der Sprache mehr oder weniger nützlich sein können und die Klarheit der Syntax von den Spracheigenschaften abhängt.
Wie ich in einem Kommentar oben erwähne, gibt es für Scala gute Linsenbibliotheken, obwohl die Sprache selbst diese nicht bereitstellt (und wohl auch nicht). Angenommen, wir haben die folgenden Klassen:
%Vor%Und eine Instanz:
%Vor%Mit Shapeless können Sie Folgendes schreiben (beachten Sie, dass in der kommenden Version 2.0 der Isomorphie-Boilerplate nicht notwendig sein wird):
%Vor%Und dann:
%Vor%Und jetzt kann Foo McBar einfach seine E-Mail-Domain ändern:
%Vor%Das ist alles Vanilla Scala - die aktuelle Version von Shapeless (1.2.4) verwendet keine Makros oder Compiler-Plugins usw. und wird auf Scala 2.9 funktionieren. Wenn wir bereit sind, die Makros von Scala 2.10 zu verwenden, können wir eine noch schönere Syntax und weniger Vortex verwenden:
%Vor%Dies verwendet Rillit , eine Proof-of-Concept-Linsenbibliothek, die von Aki Saarinen (und später von mir adaptiert ).
All dies könnte in Java gemacht worden sein, obwohl die Syntax wahrscheinlich nicht so sauber ist. In der Tat bin ich sicher, dass es Objektivbibliotheken für Java gibt, obwohl ich noch nie welche gesehen oder verwendet habe, und die relative mangelnde Betonung unveränderlicher Datentypen bedeutet, dass die meisten Java-Entwickler keine Objektive benötigen oder wollen.
Es gibt Objektive in Octarine , die zum Erstellen von Datensatzschlüsseln zum Erstellen von Pfaden in Datenstrukturen verwendet werden:
%Vor%Tags und Links scala java immutability lenses