1

この問題に関してSOでいくつかの質問を見ましたが、それでも本当に良い答えを見つけることができませんでした:

、、State Enumの 3 つの状態を持つ が必要です。GoodNotGoodUnknown

今まで、大したことはありません。しかし、状態は外部 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
    }
  }
}

ここで、次の 2 つの問題があります。

  • 1 つ目: 網羅的ではない一致についてコンパイラに警告してもらいたい。これは、封印された特性を使用して達成できます。これにより、2番目の問題が発生します

  • 2番目: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

Unknown ケースのクラスを使用してみることができます。

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 に答える