scala.util.Try: Wie erziele ich einen werfbaren Wert? Mustervergleich?

7

Die folgenden REPL Snippets setzen voraus:

%Vor%

Warum werden diese beiden Anweisungen nicht kompiliert? Ich bekomme "Konstruktor kann nicht zum erwarteten Typ instanziiert werden":

%Vor%

Ich kann den Erfolgswert aus einem Try mit get oder toOption erhalten. Gibt es eine entsprechende Möglichkeit, den fehlgeschlagenen Throwable -Wert oder Option[Throwable] zu erhalten?

EDIT: Casting von Fehler / Erfolg zu versuchen funktioniert

%Vor%     
clay 31.08.2014, 02:12
quelle

2 Antworten

11

Das erste Snippet wird nicht kompiliert, weil Success kein Untertyp von Failure ist. Der Compiler denkt, dass Sie dumm sind, da der Fall Success(i) niemals übereinstimmt.

Um ein einfacheres Beispiel zu nehmen, kompiliert das auch nicht.

%Vor%

Aus dem gleichen Grund auch nicht.

%Vor%

Was Sie geschrieben haben, funktioniert fast, aber der Wert, den Sie vergleichen, muss einen allgemeineren Typ von Try[_] haben (was es sowieso hätte, wenn die Musterübereinstimmung tatsächlich in einem nützlichen Kontext verwendet würde) .

%Vor%     
Chris Martin 31.08.2014, 02:27
quelle
17

Bedenken Sie Folgendes:

%Vor%

Dies funktioniert, weil Success und Failure Unterklassen der abstrakten Klasse Try sind. Der folgende Code kann jedoch nicht kompiliert werden, da Sie nicht mehr mit einem generischen Try und stattdessen mit einem Failure übereinstimmen, was nie eine Instanz von Success sein kann.

%Vor%

Das ist, als ob man versucht, eine Integer mit einer String zu vergleichen, das macht keinen Sinn.

Wenn Sie die Throwable über Mustervergleich erhalten möchten, sehen Sie sich das erste Code-Snippet an.

Eine weitere Möglichkeit, Throwable zu extrahieren, wäre die Verwendung der failed -Methode für Ihre Try , die die Throwable von einem Fehler innerhalb von Success umschließt.

%Vor%

Das Aufrufen von Success löst jedoch eine weitere Ausnahme aus.

    
Michael Zajac 31.08.2014 02:26
quelle

Tags und Links