objetos - scala tutorial español pdf
¿Cómo clonar una instancia de clase de caso y cambiar solo un campo en Scala? (3)
Desde 2.8, las clases de casos de Scala tienen un método de copy
que aprovecha los params nombrados / predeterminados para hacer su magia:
val newPersona =
existingPersona.copy(sentMessages = existing.sentMessages + newMessage)
También puedes crear un método en Persona
para simplificar el uso:
case class Persona(
svcName : String,
svcId : String,
sentMsgs : Set[String]
) {
def plusMsg(msg: String) = this.copy(sentMsgs = this.sentMsgs + msg)
}
entonces
val newPersona = existingPersona plusMsg newMsg
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 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 debo especificar todos los campos, aunque solo uno cambie. ¿Hay alguna manera de clonar Perone 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 Map, sería fácil de hacer.
case class
viene con un método de copy
que está dedicado exactamente a este uso:
val newPersona = existingPersona.copy(sentMessages =
existingPersona.sentMessages + newMessage)
existingPersona.copy(sentMessages = existingPersona.sentMessages + newMessage)