У меня есть класс дел с 25 полями, и мне нужно преобразовать его в другой с 22 полями, из которых 19 из них являются общими, а 3 просто переименованы.
Я нашел несколько примеров того, как это сделать, используя shapeless
(например, ответ здесь и несколько примеров кода из Miles Sabin здесь и здесь ), но последний из них выглядит несколько устаревшим, и я не могу понять из примера на Github, как я могу использовать бесформенный для переименования нескольких полей или сделать больше манипуляций над полем перед добавлением его вновый объект.Кто-нибудь может мне помочь?
Пример упрощенного кода;
import shapeless.LabelledGeneric
case class A(fieldA:Int, fieldB:String, fieldC:String)
case class B(fieldARenamed:Int, fieldB:String, fieldC:String, fieldCTransformed:String)
val aGen = LabelledGeneric[A]
val bGen = LabelledGeneric[B]
val freddie = new A(1,"Freddie","somestring")
val record = aGen.to(freddie)
val atmp = freddie.fieldA
record.Remove("fielda")
val freddieB = bGen.from(record +
(Symbol("fieldARenamed") ->> atmp) +
(Symbol("fieldCTransformed") ->> freddie.fieldC.toUpperCase)
) //Errors everywhere, even if I replace + with :: etc.
У меня есть ощущение, что где-то здесь появится 1015 *, но понимание того, как это сделать вбыл бы интересен самый простой способ - например, без создания дополнительных черт, таких как Field
, как в третьей ссылке выше.
В Руководство по бесформенным формам , также возможно использование одногоцитата, (например, 'fieldC
) нотация, о которой я не смог найти много информации, поэтому, если это играет роль, некоторые объяснения также были бы действительно полезны.Совершенно новый для этой глубины колдовства Scala, поэтому извиняюсь, если вопрос кажется тупым или охватывает слишком много разнородных тем.
РЕДАКТИРОВАТЬ: Во избежание сомнений, я не ищет ответы, которыепредлагаю мне просто вручную создать новый класс дел, ссылаясь на поля из первого, как в;
val freddieB = B(fieldARenamed = freddie.fieldA, fieldB = freddie.fieldB, fieldC = freddie.fieldC, fieldCTransformed =freddie.fieldC.toUpperCase)
См. комментарий ниже по различным причинам, почему это неуместно.