Исчерпывающее совпадение возможных значений объекта - PullRequest
2 голосов
/ 02 июля 2019

Сначала код:

object MyEnums {
  sealed abstract class MyEnum(val value: String)

  case object First extends MyEnum("Some_ugly_looking_value1")
  case object Second extends MyEnum("Some_ugly_looking_value2")
  case object Third extends MyEnum("Some_ugly_looking_value3")
  case object Fourth extends MyEnum("Some_ugly_looking_value4")

  def fromString(value: String): Option[MyEnum] =
    value match {
      case First.value => Option(First)
      case Second.value => Option(Second)
      case Third.value => Option(Third)
      case Fourth.value => Option(Fourth)
      case _ => None
    }
}

Здесь я пытаюсь добиться того, чтобы иметь возможность анализировать строковое значение, поступающее извне, в форму перечисленного выше перечисления.В то же время я хотел бы получить исчерпывающее предупреждение компилятора сопоставления с образцом, если я не охватываю все параметры в выражении сопоставления.Какие варианты у меня есть здесь?Мне не нравится то, что я реализовал выше, так как, если это перечисление растет, я могу просто забыть реализовать новое предложение case ...

1 Ответ

3 голосов
/ 02 июля 2019

Рассмотрим enumeratum примерно так

import enumeratum._

sealed abstract class MyEnum(override val entryName: String) extends EnumEntry

object MyEnum extends Enum[MyEnum] {
  val values = findValues

  case object First extends MyEnum("Some_ugly_looking_value1")
  case object Second extends MyEnum("Some_ugly_looking_value2")
  case object Third extends MyEnum("Some_ugly_looking_value3")
  case object Fourth extends MyEnum("Some_ugly_looking_value4")
}


MyEnum.withName("Some_ugly_looking_value1") // res1: MyEnum = First

Теперь нам не нужно возиться с сопоставлением с шаблоном при добавлении нового объекта case.

...