Laut der Dokumentation :
Der Try-Typ repräsentiert eine Berechnung, die entweder zu einem führen kann Ausnahme oder gibt einen erfolgreich berechneten Wert zurück. Es ist ähnlich wie aber semantisch verschieden von der scala.util.Either Art.
Die Dokumente gehen nicht näher darauf ein, was der semantische Unterschied ist. Beide scheinen in der Lage zu sein, Erfolge und Misserfolge zu kommunizieren. Warum würdest du eins über dem anderen benutzen?
Ich habe die Beziehung zwischen Try
, Either
und Option
in diese Antwort . Die Highlights von dort bezüglich der Beziehung zwischen Try
und Either
sind im Folgenden zusammengefasst:
Try[A]
ist isomorph zu Either[Throwable, A]
. Mit anderen Worten, Sie können eine Try
als Either
mit einem linken Typ von Throwable
behandeln, und Sie können jede Either
mit einem linken Typ von Throwable
als Try
behandeln. Es ist üblich, Left
für Fehler und Right
für Erfolge zu verwenden.
Natürlich können Sie Either
auch breiter verwenden, nicht nur in Situationen mit fehlenden oder außergewöhnlichen Werten. Es gibt andere Situationen, in denen Either
dazu beitragen kann, die Semantik eines einfachen Unionstyps auszudrücken (wobei der Wert einer von zwei Typen ist).
Semantisch könnten Sie Try
verwenden, um anzugeben, dass der Vorgang möglicherweise fehlschlägt. Sie könnten auch Either
in einer solchen Situation verwenden, insbesondere wenn Ihr "Fehler" -Typ etwas anderes ist als Throwable
(z. B. Either[ErrorType, SuccessType]
). Und dann können Sie auch Either
verwenden, wenn Sie mit einem Union-Typ arbeiten (z. B. Either[PossibleType1, PossibleType2]
).
Die Standardbibliothek enthält nicht die Konvertierungen von Either
nach Try
oder von Try
nach Either
, aber es ist ziemlich einfach, Try
und Either
nach Bedarf anzureichern:
Damit können Sie Folgendes tun:
%Vor%Um Ihre Frage zu beantworten: "Was ist der semantische Unterschied ":
Dies bezieht sich wahrscheinlich auf "flatMap" und "map", die in "Entweder" nicht vorhanden sind und Fehler entweder weiterleiten oder den Erfolgswert in Try zuordnen. Dies ermöglicht zum Beispiel die Verkettung wie
%Vor%was genau das tut, was Sie hoffen würden - gibt ein Try zurück, das entweder die erste Ausnahme oder das Ergebnis enthält.
Try hat viele andere nützliche Methoden, und natürlich seine Methode, um die Anwendung zu vereinfachen - Exception Handling.
Wenn Sie wirklich überwältigt sein wollen, gibt es zwei andere Klassen, die für diese Art von Anwendung interessant sein könnten. Scalaz hat eine Klasse namens " \ / "(früher bekannt als Prince), ausgesprochen" Entweder ", was meistens wie Entweder ist, aber flatMap und map arbeiten auf dem richtigen Wert. Ähnlich und nicht Scalactic hat eine " Oder "das ist auch ähnlich wie Beides, aber flatMap und map arbeiten mit dem Left-Wert.
Ich empfehle Scalaz nicht für Anfänger.
Either
impliziert nicht Erfolg und Misserfolg, es ist nur ein Container für entweder A oder B. Es ist üblich, es zu verwenden, um Erfolge und Misserfolge darzustellen, wobei die Konvention darin besteht, den Fehler auf die linke Seite zu setzen, und der Erfolg auf der rechten Seite.
A Try
kann als Either
angesehen werden, wobei der linke Typ auf Throwable
gesetzt ist. Try[A]
entspricht Either[Throwable, A]
.
Verwenden Sie Try
, um einen möglichen Fehler in der Berechnung eindeutig zu identifizieren, wobei der Fehler durch eine Ausnahme dargestellt wird. Wenn Sie den Fehler mit einem anderen Typ (z. B. einem String oder einem Satz von Fallklassen, die ein versiegeltes Merkmal erweitern) darstellen möchten, verwenden Sie Either
.
Either
ist allgemeiner, da es einfach disjunkte Typenverknüpfungen darstellt.
Insbesondere kann es eine Vereinigung gültiger Rückgabewerte eines Typs X
und Exception
darstellen. Es wird jedoch nicht versucht, Ausnahmen selbst zu erfassen. Sie müssen try-catch-Blöcke um gefährlichen Code hinzufügen und dann sicherstellen, dass jeder Zweig eine entsprechende Unterklasse von Either
zurückgibt (normalerweise: Left
für Fehler, Right
für erfolgreiche Berechnungen).
Try[X]
kann man sich als Either[Exception, X]
vorstellen, aber es fängt auch Exceptions ab.
Either[X, Y]
Verwendung ist allgemeiner. Wie sein Name sagt, kann er entweder ein Objekt vom Typ X oder von Y darstellen.
Try[X]
hat nur einen Typ und kann entweder ein Erfolg [X] oder ein Fehler sein (der ein Throwable
enthält).
Irgendwann wird Try[X]
als Either[Throwable,X]
Was ist schön an Try[X]
ist, dass Sie weitere Operationen verketten können, wenn es wirklich ein Erfolg ist, werden sie ausgeführt, wenn es ein Fehler war, werden sie nicht
Natürlich kannst du immer online wie
%Vor%Tags und Links scala