我有这个示例代码:
import java.util.UUID
import shapeless.LabelledGeneric
import shapeless.record._
import shapeless.syntax.singleton._
object LabelTest extends App {
case class IncomingThing(name: String, age: Int)
case class DatabaseIncomingThing(name: String, age: Int, id: UUID)
val genIncoming = LabelledGeneric[IncomingThing]
val genDatabase = LabelledGeneric[DatabaseIncomingThing]
val thing = IncomingThing("John", 42)
val structuralVersionOfIncomingThing = genIncoming.to(thing)
val updated = genDatabase.from(structuralVersionOfIncomingThing + ('id ->> UUID.randomUUID()))
println(updated) // DatabaseIncomingThing(John,42,a45081f2-4ed5-4d2b-8fd9-4d8986875ed7)
}
这很好,因为我不必编写从IncomingThing
to复制所有字段的样板DatabaseIncomingThing
。但是,我希望不必同时维护这两种类型,因为两者之间有非常明确的关系(一个有id
,另一个没有)。
有没有办法通过添加或删除一个字段来从给定的案例类创建类型?我想像
type IncomingThing = withoutField[DatabaseIncomingThing]('id)
或者类似的东西。