2015-11-08 19 views
14

Załóżmy, że mam wyliczenie:bezpieczny Scala sposób konwertowania ciąg na wartość wyliczenia

object WeekDay extends Enumeration { 
    type WeekDay = Value 
    val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value 
} 

Chciałbym, aby móc konwertować ciąg wartości codzienne i to jest w porządku:

scala> WeekDay.withName("Tue") 
res10: WeekDay.Value = Tue 

Ale jeśli przekazuję jakąś "nieznaną" wartość, otrzymuję wyjątek:

scala> WeekDay.withName("Ou") 
java.util.NoSuchElementException: None.get 
    at scala.None$.get(Option.scala:322) 
    at scala.None$.get(Option.scala:320) 
    at scala.Enumeration.withName(Enumeration.scala:124) 
    ... 32 elided 

Czy istnieje jakiś elegancki sposób bezpiecznej konwersji St pierścień do wartości wyliczenia?

Odpowiedz

26

Możesz dodać metodę wyliczania aby zwrócić Option[Value]:

def withNameOpt(s: String): Option[Value] = values.find(_.toString == s) 

Uwaga: istniejąca withName metoda faktycznie robi dokładnie to, czym wywołuje getOrElse rzucanie wyjątku w przypadku „innego”.

+2

Żałuję, że to część standardowej biblioteki, to idiomatyczna Scala, mimo wszystko, aby mieć bezpieczny sposób robienia rzeczy. –

3

Opierając się na szczycie odpowiedź @Shadowlands „s, dodałem tę metodę do mojego wyliczenia mają wartość domyślna unknwon bez czynienia z opcji:

def withNameWithDefault(name: String): Value = 
    values.find(_.toString.toLowerCase == name.toLowerCase()).getOrElse(Unknown) 

więc enum wyglądałby następująco:

object WeekDay extends Enumeration { 
    type WeekDay = Value 
    val Mon, Tue, Wed, Thu, Fri, Sat, Sun, Unknown = Value 

    def withNameWithDefault(name: String): Value = 
    values.find(_.toString.toLowerCase == name.toLowerCase()).getOrElse(Unknown) 
} 
Powiązane problemy