Powiedzmy, że mam klasę przypadków, która reprezentuje osobowości, ludzi z różnych sieci społecznościowych. Instancje tej klasy są w pełni niezmienne i są przechowywane w niezmiennych kolekcjach, które ostatecznie zostaną zmodyfikowane przez aktora Akka.
Teraz mam klasę przypadków z wieloma polami i otrzymuję komunikat, że muszę zaktualizować jedno z pól, coś takiego:
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)
Zauważ, że muszę określić wszystkie pola, chociaż tylko jedna zmiana. Czy istnieje sposób na sklonowanie istniejącej Persony i zastąpienie tylko jednego pola bez określania wszystkich pól, które się nie zmieniają? Czy mogę napisać to jako cechę i używać jej we wszystkich moich klasach przypadków?
Gdyby Persona była instancją podobną do mapy, byłoby to łatwe.
copy
metodę, jeśli zadeklarujecase class
.Od wersji 2.8 klasy przypadków Scala mają
copy
metodę, która wykorzystuje parametry nazwane / domyślne do działania swojej magii:Możesz także utworzyć metodę,
Persona
aby uprościć korzystanie:następnie
źródło
źródło
Rozważ użycie
lens
wShapeless
bibliotece:Ponadto, w przypadku zagnieżdżenia klas spraw, metody
getter
isetter
mogą być nieco uciążliwe w komponowaniu. Będzie to dobra okazja do uproszczenia za pomocą biblioteki obiektywów.Zobacz także:
źródło
Nie chciałem dołączać dużej biblioteki do wykonywania złożonych soczewek, które pozwalają ci ustawić wartości głęboko w zagnieżdżonych klasach przypadków. Okazuje się, że to tylko kilka wierszy kodu w bibliotece scalaz:
Następnie możesz utworzyć soczewki, które ustawiają wartości głęboko zagnieżdżone o wiele łatwiej niż przy użyciu wbudowanej funkcji kopiowania. Oto link do dużego zestawu, jeśli złożone soczewki używane przez moją bibliotekę do ustawiania mocno zagnieżdżonych wartości.
źródło