2010-05-05 15 views
5

Mam wyliczenie, które chcę użyć w wzorcach dopasowania w aktor. Nie dostaję tego, czego się spodziewam, a teraz podejrzewam, że brakuje mi czegoś prostego.Scala Dopasuj/Porównaj wyliczenia

Moje wyliczenie,

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

Następnie tworzę OPS z ciągiem:

val op = Ops.valueOf("create") 

wewnątrz mojego meczu, mam:

case (Ops.Create, ...) 

Ale Ops.Create robi Wygląda na równe ops.valueOf ("create")

Były to tylko atom „tworzyć”, a później jest Niektórzy (Create)

Mam nadzieję, że to wystarczy informacji, aby ktoś mi powiedzieć, co mi brakuje ...

Dzięki

Odpowiedz

7

Jeśli jesteś po prostu staramy się uzyskać kopię Create, to należy odnieść się do niego bezpośrednio w kodzie:

val op = Ops.Create 

Ale jeśli parsowania go z łańcucha, łańcuch może zawierać śmieci, tak valueOf zwraca Option:

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

teraz w meczu można po prostu przeprowadzić wzdłuż Option[Ops.Value] i szukać:

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

i masz wbudowaną odporność na śmieci jako dane wejściowe.

+0

Ridicule pomocna odpowiedź, dziękuje Rex! – Tim

+7

Dla każdego, kto to czyta w przyszłości, 'Enumeration.valueOf' jest przestarzałe: zamiast tego użyj' withName' –

1

Enumeration.valueOf zwraca None lub Some, ponieważ możesz poprosić o utworzenie wartości, która nie istnieje. W twoim przypadku na przykład Ops.valueOf("blah") zwróci None, ponieważ nie masz odpowiedniej wartości wyliczeniowej.

Szczerze mówiąc, w tym przypadku użyłbym case class lub case object zamiast Enumeration (zapewniają one lepsze bezpieczeństwo typu).

-1

Wygląda na to, że muszę użyć metody "get" zwróconych "Some", aby uzyskać to, co chciałem. Na przykład.

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

Nie wydaje się intuicyjny ani przyjazny, ale działa.

+0

To dlatego, że 'Enumeration.valueOf' zwraca obiekt' Option', co oznacza, że ​​musisz użyć 'get', aby uzyskać wartość wartości. – mipadi