tutorial objetos metodos introduccion español clases scala

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)