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.
copy
método si declara acase class
.Desde 2.8, las clases de caso Scala tienen un
copy
método que aprovecha los parámetros con nombre / predeterminados para hacer su magia:También puede crear un método
Persona
para simplificar el uso:luego
fuente
fuente
Considere usar
lens
en laShapeless
biblioteca:Además, en caso de que haya clases de casos anidadas , los métodos
getter
ysetter
pueden 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