Digamos que tengo una clase de caso que representa personas, personas en diferentes redes sociales. Las instancias de esa clase son completamente inmutables, y se mantienen en colecciones inmutables, para ser eventualmente modificadas por un actor de Akka.
Ahora, tengo una clase de caso con muchos campos, y recibo un mensaje que dice que debo actualizar uno de los campos, algo como esto:
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)
Tenga en cuenta que tengo que especificar todos los campos, aunque solo uno cambie. ¿Hay alguna manera de clonar la persona existente y reemplazar solo un campo, sin especificar todos los campos que no cambian? ¿Puedo escribir eso como un rasgo y usarlo para todas mis clases de casos?
Si Persona fuera una instancia similar a un mapa, sería fácil de hacer.

copymétodo si declara acase class.Desde 2.8, las clases de caso Scala tienen un
copymétodo que aprovecha los parámetros con nombre / predeterminados para hacer su magia:También puede crear un método
Personapara simplificar el uso:luego
fuente
fuente
Considere usar
lensen laShapelessbiblioteca:Además, en caso de que haya clases de casos anidadas , los métodos
getterysetterpueden ser un poco tediosos para componer. Será una buena oportunidad para simplificar mediante el uso de la biblioteca de lentes.Por favor, consulte también:
fuente
No quería incluir una gran biblioteca para hacer lentes complejos que le permitieran establecer valores profundos en las clases de casos anidados. Resulta que son solo unas pocas líneas de código en la biblioteca scalaz:
Luego puede crear lentes que establezcan valores profundamente anidados mucho más fácilmente que usar la función de copia integrada. Aquí hay un enlace a un gran conjunto de lentes complejas que mi biblioteca utiliza para establecer valores muy anidados.
fuente