У меня есть необходимость в изменении нескольких полей класса case без кода copy
. Кажется бесформенным, это хороший способ пойти.Shapeless: пакетное обновление с использованием записи
Согласно example, я мог бы использовать lens
в таком виде:
lensA ~ lensB ~ lensC set(something)(valA, valB, valC)
, который хорошо. Однако в моем случае вложенные поля не являются моей самой большой проблемой (я уверен, что это будет: - <). Таким образом, lens
решение почти так же, как:
something.copy(a = valA, b = valB, c = valC)
Одна вещь, которую я хотел бы отметить, что не все модификации обязательно произошло. В моем псевдослучайном случае я могу обновить все a,b,c
или некоторые из них, или ни одного, на основе некоторого if/else
s в контексте.
Поэтому Record
с этим видом использования является в значительной степени то, что мне нужно:
someHList + ('a ->> valA) + ('b ->> valB) + ('c ->> valC)
Даже в конечном счете:
Seq(
'a ->> valA,
'b ->> valB,
'c ->> valC
).fold(someHList)(_ + _)
что не возможно в соответствии с моим компилятором (выход типа рассогласование ошибка).
Я знаю, что это использование существует только в моем воображении, а не в документации. Однако я бы очень признателен за правильный способ использования Record
или lens
или что-то еще, чтобы решить мою проблему. Также приветствуется любой другой элегантный способ!
THX!
Вы посмотрели [примеры занятий a la carte] (https://github.com/milessabin/shapeless/blob/master/examples/src/main/scala/shapeless/examples/alacarte.scala) пример? –
@MilesSabin за ваш быстрый ответ! Бесплодные скалы! Однако я здесь потерялся. В примере a la carte я мог получить только класс случайных классов. Что мне следует сделать для обновления существующего экземпляра класса case? Я что-то упустил? – noru