【发布时间】:2019-04-30 11:31:40
【问题描述】:
我想介绍一些类型来表示更大类型中字段的可能值。该字段需要能够对 JSON 进行编码/解码,还需要能够写入/读取到数据库中。
我还是 Scala 的新手,我想要的类型是 sum 类型 Status = NotVerified | Correct | Wrong。由于我希望有一个与每个构造函数关联的字符串表示,我创建了一个带有String 参数的密封案例类,然后是扩展该案例类的对象。为了能够编码/解码,我还需要隐式,但我不确定如何构造它。我可以将它们放在对象内部的一个新对象中,如下所示:
sealed case class Status(name: String)
object Status {
object NotVerified extends Status("not_verified")
object Correct extends Status("correct")
object Wrong extends Status("wrong")
object implicits {
implicit val encodeStatusJson: Encoder[Status] =
_.name.asJson
implicit val decodeStatusJson: Decoder[Status] =
Decoder.decodeString.map(Status(_))
implicit val encodeStatus: MappedEncoding[Status, String] =
MappedEncoding[Status, String](_.name)
implicit val decodeStatus: MappedEncoding[String, Status] =
MappedEncoding[String, Status](Status(_))
}
}
…然后在需要的地方明确地import 这些,但那是相当…明确的。
组织这种类型的集合+隐式的好方法是什么?
【问题讨论】:
-
您实现
Status的方式存在问题,因为您可以创建Status("not_verified"),但类型将是Status而不是NotVerified,并且match类型不会给出正确的结果。你可以制作Statusabstract,但我怀疑这会破坏Decoder。 -
@Tim 哦。你说得对!谢谢!我不真的想要这里的子类型。我想我应该使用密封特征,然后扩展它的案例类?但随后 quill/circe 想要的解码器/编码器将非常重复……
-
是的,这是进行简单枚举的正确方法。使
Status抽象并创建一个伴随对象Status与def apply(name: String): Status = ...匹配字符串并返回适当的子类。然后Status("not_verified")将返回正确的底层类型。
标签: scala implicit circe quill.io