Scala сопоставить / сравнить перечисления - PullRequest
5 голосов
/ 05 мая 2010

У меня есть перечисление, которое я хочу использовать в сопоставлении с образцом в актере. Я не понимаю, чего я ожидал, и теперь я подозреваю, что упускаю что-то простое.

Мое перечисление,

object Ops extends Enumeration {
  val Create = Value("create")
  val Delete = Value("delete")
}

Затем я создаю Ops из строки:

val op = Ops.valueOf("create")

Внутри моего матча у меня есть:

case (Ops.Create, ...)

Но, похоже, Ops.Create не равно ops.valueOf ("create")

Первый - это просто атом «создать», а последний - «Некоторое» (создание)

Надеюсь, этого достаточно, чтобы кто-то сказал мне, что мне не хватает ...

Спасибо

Ответы [ 3 ]

7 голосов
/ 05 мая 2010

Если вы просто пытаетесь получить копию Create, вам следует обратиться к ней прямо в коде:

val op = Ops.Create

Но если вы анализируете ее из строки, строка может содержать мусор, поэтому valueOf возвращает Option:

val op1 = Ops.valueOf("create")  // Some(Ops.Create)
val op2 = Ops.valueOf("delete")  // Some(Ops.Delete)
val op3 = Ops.valueOf("aljeaw")  // None

Теперь в вашем матче вы можете просто нести Option[Ops.Value] и искать:

case(Some(Ops.Create),...)

и у вас есть встроенная устойчивость к мусору в качестве входных данных.

1 голос
/ 05 мая 2010

Enumeration.valueOf возвращает None или Some, поскольку вы, возможно, просите создать значение, которое не существует. Например, в вашем случае Ops.valueOf("blah") вернет None, поскольку у вас нет подходящего значения перечисления.

Если честно, в этом случае я бы использовал класс case или case вместо Enumeration (они обеспечивают лучшую безопасность типов).

0 голосов
/ 05 мая 2010

Похоже, мне нужно было использовать метод get возвращаемых Some, чтобы получить то, что я хотел. Э.Г.

ops.valueOf("create").get == Ops.Create

Не кажется ни интуитивным, ни дружественным, но это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...