我在一个项目中使用 Slick,为此我需要行的 Slick 表示以及内存中的表示。为了简洁起见,我将在这里使用一个更简单的示例。举例来说,我有这两种类型:
type RawType =
(String, Int, Boolean)
type RawTypeRep =
(Rep[String], Rep[Int], Rep[Boolean])
有没有一种方法可以从另一个生成一个,这样我就不必同步更新它们?
或者也许从案例类生成它们?我确实有一个案例类表示,但它实际上与我所拥有的类型略有不同,因为当我对案例类进行水合时,我会进行一些突变,从而导致类型更改。
最佳答案
这似乎是 shapeless 的工作,尽管我不确定将其应用到您的案例的最佳方法。我能想到的最好的方法是不要从另一个生成一个,而是至少在编译时验证两者是否匹配:
import shapeless._
import shapeless.poly._
import shapeless.ops.tuple._
object ToRep extends (Id ~> Rep) {
def apply[A](a: A): Rep[A] = ???
}
type CheckRep[A, B] = Mapper.Aux[A, ToRep.type, B]
type RawType = (String, Int, Boolean)
type RawTypeRep = (Rep[String], Rep[Int], Rep[Boolean])
type RawTypeRepWrong = (Rep[String], Rep[String], Rep[Boolean])
implicitly[CheckRep[RawType, RawTypeRep]] // compiles
implicitly[CheckRep[RawType, RawTypeRepWrong]] // compile error
我猜想如果退一步到更大的上下文,可能有更好的方法来处理这个问题。可能值得浏览一下 Shapeless 的文档,看看它可以做哪些事情,看看这是否能给您带来任何想法。
关于scala - 尝试从 Scala 中的其他类型生成类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51989231/