220 votes

Comment faire pour cloner une instance de la classe affaire et modifier le champ juste en Scala ?

Disons que j'ai une classe de cas qui représente les personnages, les gens sur les différents réseaux sociaux. Les Instances de cette classe sont entièrement immuable, et sont détenus dans immuable collections, pour être éventuellement modifiée par un Akka acteur.

Maintenant, j'ai une classe de cas avec de nombreux champs, et je reçois un message qui dit que je doit 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)

Avis-je spécifier tous les domaines, même si un seul des changements. Est-il un moyen de cloner existingPersona et remplacer un champ, sans spécifier tous les champs qui ne changent pas? Puis-je écrire que comme un trait et de l'utiliser pour toutes mes classes de cas?

Si Persona est une Carte-comme exemple, il serait facile à faire.

334voto

Nicolas Points 11558

est livré avec une méthode qui vise exactement à cet usage :

48voto

Kevin Wright Points 31665

Depuis 2.8, Scala classes affaire ont une `` méthode qui tire profit du nommé par défaut/params de travailler sa magie :

Vous pouvez également créer une méthode sur `` pour simplifier l’utilisation :

puis

10voto

Jean-Philippe Pellet Points 25240
existingPersona.copy(sentMessages = existingPersona.sentMessages + newMessage)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X