Angenommen, ich habe eine Fallklasse, die Personas repräsentiert, Menschen in verschiedenen sozialen Netzwerken. Instanzen dieser Klasse sind vollständig unveränderlich und werden in unveränderlichen Sammlungen aufbewahrt, die schließlich von einem Akka-Schauspieler modifiziert werden.
Jetzt habe ich eine Fallklasse mit vielen Feldern und erhalte die Meldung, dass ich eines der Felder aktualisieren muss.
case class Persona(serviceName : String,
serviceId : String,
sentMessages : Set[String])
// Somewhere deep in an actor
val newPersona = Persona(existingPersona.serviceName,
existingPersona.serviceId,
existingPersona.sentMessages + newMessage)
Beachten Sie, dass ich alle Felder angeben muss, obwohl sich nur eines ändert. Gibt es eine Möglichkeit, vorhandene Personen zu klonen und nur ein Feld zu ersetzen, ohne alle Felder anzugeben, die sich nicht ändern? Kann ich das als Merkmal schreiben und für alle meine Fallklassen verwenden?
Wenn Persona eine kartenähnliche Instanz wäre, wäre dies einfach.
copy
Methode haben wird, wenn er a deklariertcase class
.Seit 2.8 haben Scala-
copy
Fallklassen eine Methode, die benannte / Standardparameter nutzt, um ihre Magie zu entfalten:Sie können auch eine Methode erstellen
Persona
, um die Verwendung zu vereinfachen:dann
quelle
quelle
Erwägen Sie die Verwendung
lens
in derShapeless
Bibliothek:Wenn Sie verschachtelte Fallklassen haben, kann das Erstellen der Methoden
getter
undsetter
etwas mühsam sein. Es ist eine gute Chance, durch Verwendung der Objektivbibliothek zu vereinfachen.Bitte beachten Sie auch:
quelle
Ich wollte keine große Bibliothek für komplexe Objektive einbinden, mit denen Sie Werte tief in verschachtelten Fallklassen festlegen können. Es stellt sich heraus, dass es sich nur um ein paar Codezeilen in der Scalaz-Bibliothek handelt:
Sie können dann Objektive erstellen, die tief verschachtelte Werte viel einfacher festlegen als die integrierte Kopierfunktion. Hier ist ein Link zu einem großen Satz komplexer Objektive, mit denen meine Bibliothek stark verschachtelte Werte festlegt.
quelle