1

我看到了关于这个问题的几个问题,但仍然找不到一个很好的答案:

我想要一个State Enum, 有 3 个状态:Good, NotGood, 和Unknown.

到现在为止,没什么大不了的。但由于状态来自外部 API(未记录,这就是Unknown状态的原因),它使用蛇案例,所以我做了一个findByName转换:

object State extends Enumeration {
  val Good = Value("good")
  val NotGood = Value("not_good")
  val Unknown = Value("unknown") // "unknown" ??

  def findByName(name: String): State.Value = {
    Try(State.withName(name)).getOrElse {
      Logger.warn(s"Found unexpected result: $name")
      Unknown
    }
  }
}

现在,有两个问题:

  • 第一:我希望编译器警告我有关非详尽匹配的信息。这可以使用密封特征来实现,这导致了我的第二个问题

  • 第二:在Unknown我想保存收到的值的情况下,但Enums在定义时获取名称,而不是在构造时获取名称。但是如果我有一个密封的特征,就像这个教程一样,我怎么能定义这样的场景呢?

我得到了类似的东西:

sealed abstract class State(val name: String)

case object Good extends State("good")
case object NotGood extends State("not_good")
case object Unknown extends State("unknown")

尽管如此,它unknown是硬编码的,我希望它是一个参数/构造函数参数。

还有,财产丢了findByname……

虽然我更喜欢使用“纯”Scala 的解决方案,但也希望看到一些使用 Shapeless 或 Cats 的解决方案

4

1 回答 1

2

您可以尝试对未知情况使用一个类:

case class Unknown(value: String) extends State("unknown")
...
def findByName (name: String) = name match {
  case "good" -> Good
  case "not_good" -> NotGood
  case x -> Unknown(x) 
}
于 2016-03-13T20:43:09.177 回答