Допустим, у меня есть кейс-класс, который представляет персонажей, людей в разных социальных сетях. Экземпляры этого класса являются полностью неизменяемыми и хранятся в неизменяемых коллекциях, которые в конечном итоге изменяет актер Акка.
Теперь у меня есть класс case со многими полями, и я получаю сообщение о том, что мне нужно обновить одно из полей, примерно так:
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)
Обратите внимание, я должен указать все поля, хотя только одно из них изменяется. Есть ли способ клонировать существующееPersona и заменить только одно поле, не указывая все поля, которые не меняются? Могу ли я написать это как черту характера и использовать ее для всех моих кейс-классов?
Если бы Persona был экземпляром, похожим на Map, это было бы легко сделать.
copy
метод, если он объявитcase class
.Начиная с
copy
версии 2.8, у классов классов Scala есть метод, который использует именованные / стандартные параметры для работы своей магии:Вы также можете создать метод
Persona
для упрощения использования:затем
источник
источник
Рассмотрите возможность использования
lens
вShapeless
библиотеке:Кроме того, в случае , если у вас есть вложенные классы дела,
getter
иsetter
методы могут быть немного утомительно композ. Это будет хороший шанс упростить использование библиотеки линз.Пожалуйста, также обратитесь к:
источник
Я не хотел включать большую библиотеку для создания сложных линз, которые позволяют вам устанавливать значения глубоко во вложенных классах дел. Оказывается, это всего лишь несколько строк кода в библиотеке scalaz:
Затем вы можете создавать линзы, которые устанавливают глубоко вложенные значения, намного проще, чем используя встроенную функцию копирования. Вот ссылка на большой набор сложных линз, которые моя библиотека использует для установки сильно вложенных значений.
источник