Digamos que eu tenha uma classe de caso que represente personas, pessoas em diferentes redes sociais. Instâncias dessa classe são totalmente imutáveis, e são mantidas em coleções imutáveis, para serem eventualmente modificadas por um ator Akka.
Agora, tenho uma classe de caso com muitos campos e recebo uma mensagem dizendo que devo atualizar um dos campos, algo como isto:
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)
Observe que eu tenho que especificar todos os campos, mesmo que apenas um seja alterado. Existe uma maneira de clonar o existentePersona e substituir apenas um campo, sem especificar todos os campos que não mudam? Posso escrever isso como uma característica e usá-lo para todas as minhas classes de casos?
Se o Persona fosse uma instância do tipo mapa, seria fácil.
copy
método se declarasse acase class
.Desde a 2.8, as classes de caso Scala têm um
copy
método que tira proveito dos parâmetros nomeados / padrão para trabalhar sua mágica:Você também pode criar um método
Persona
para simplificar o uso:então
fonte
fonte
Considere usar
lens
naShapeless
biblioteca:Além disso, no caso de você aninhar classes de caso, os métodos
getter
esetter
podem ser um pouco entediantes de compor. Será uma boa chance de simplificar usando a biblioteca de lentes.Consulte também:
fonte
Eu não queria incluir uma grande biblioteca para fazer lentes complexas que permitam definir valores profundos em classes de casos aninhadas. Acontece que são apenas algumas linhas de código na biblioteca scalaz:
Você pode criar lentes que definem valores profundamente aninhados muito mais facilmente do que usar o recurso de cópia incorporado. Aqui está um link para um grande conjunto de lentes complexas que minha biblioteca usa para definir valores fortemente aninhados.
fonte