2010-05-05 2 views
5

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

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

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

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

val op = Ops.valueOf("create") 

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

case (Ops.Create, ...) 

Но Ops.Create Безразлично 't кажется равным ops.valueOf ("create")

Первое просто атом «создать» и позже в некоторых (создать)

Будем надеяться, что это достаточно информации для кого-то, чтобы сказать мне, что я пропускаю ...

Благодаря

ответ

7

Если вы просто пытаетесь получить копию 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),...) 

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

+0

Смешно полезный ответ, спасибо Рексу! – Tim

+7

Для тех, кто читает это в будущем, 'Enumeration.valueOf' устарел: используйте' withName' вместо –

1

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

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

-1

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

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

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

+0

Это потому, что 'Enumeration.valueOf' возвращает объект' Option', что означает, что вы должны использовать 'get' для получения значения. – mipadi

Смежные вопросы