2016-08-09 30 views
0

Ich bin neu in scala Ich versuche, für/Ertrag zu verstehen und nicht verstehen, warum der folgende Code eine Option kein Stringin scala, warum für yield return Option tut statt String

val opString: Option[String] = Option("test") 
val optionStr : Option[String] = for { 
    op <- opString 
} yield { 
    opString match { 
    case Some(s) => s 
    case _ => "error" 
    } 
} 
kehrt

Antwort

2

Eine For-Expression ist syntaktischer Zucker für eine Reihe von map, flatMap und withFilter Rufe. Ihre spezifisch für Ausdruck ist so etwas wie dies übersetzt:

opString.map(op => opString match { 
    case Some(s) => s 
    case _ => "error" 
}) 

Wie Sie sehen können, wird Ihr Ausdruck nur über opString Karte und nicht in irgendeiner Weise auszupacken.

+0

Tatsächlich ist Ihr Ausdruck äquivalent zu "opString" selbst;) Wenn die 'Option' leer ist, wird die Funktion, die an die Funktion' map' übergeben wurde, nicht aufgerufen. – marstran

1

entzuckert Ausdruck für Ihre für ... Ausbeute Ausdruck ist:

val optionStr = opString.map { 
    op => 
    opString match { 
     case Some(s) => s 
     case _ => "error" 
    } 
} 

Die Art der opString Spiel {...} ist String, so das Ergebnis Typ Karte des Anwendens (String => String) zu Option [Zeichenfolge] ist eine Option [Zeichenfolge]

0

Was Sie suchen ist getOrElse:

opString.getOrElse("error") 

Dies entspricht:

opString match { 
    case Some(s) => s 
    case _ => "error" 
} 
Verwandte Themen