Disons que j'ai une classe de cas qui représente des personnages, des gens sur différents réseaux sociaux. Les instances de cette classe sont entièrement immuables et sont conservées dans des collections immuables, pour être éventuellement modifiées par un acteur Akka.
Maintenant, j'ai une classe de cas avec de nombreux champs et je reçois un message qui me dit que je dois mettre à jour l'un des champs, quelque chose comme ceci:
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)
Remarquez que je dois spécifier tous les champs, même si un seul change. Existe-t-il un moyen de cloner la persone existante et de remplacer un seul champ, sans spécifier tous les champs qui ne changent pas? Puis-je écrire cela comme un trait et l'utiliser pour toutes mes classes de cas?
Si Persona était une instance de type carte, ce serait facile à faire.
copy
méthode s'il déclare acase class
.Depuis la version 2.8, les classes de cas Scala ont une
copy
méthode qui tire parti des paramètres nommés / par défaut pour opérer sa magie:Vous pouvez également créer une méthode
Persona
pour simplifier l'utilisation:puis
la source
la source
Pensez à utiliser
lens
dans laShapeless
bibliothèque:De plus, si vous avez des classes de cas imbriquées , les méthodes
getter
etsetter
peuvent être un peu fastidieuses à composer. Ce sera une bonne occasion de simplifier en utilisant la bibliothèque de lentilles.Veuillez également vous référer à:
la source
Je ne voulais pas inclure une grande bibliothèque pour faire des lentilles complexes qui vous permettent de définir des valeurs profondes dans les classes de cas imbriquées. Il s'avère que ce ne sont que quelques lignes de code dans la bibliothèque scalaz:
Vous pouvez ensuite créer des objectifs qui définissent des valeurs profondément imbriquées beaucoup plus facilement que d'utiliser la fonction de copie intégrée. Voici un lien vers un grand ensemble d'objectifs complexes que ma bibliothèque utilise pour définir des valeurs fortement imbriquées.
la source