Beide Typen Unit
und Nothing
zeigen eine Funktion an, die nichts zurückgibt. Was ist der Unterschied zwischen ihnen?Was ist der Unterschied zwischen Einheit und Nichts?
Antwort
Unit
ist ein Typ, der genau einen Wert hat - siehe Unit type. Auf der anderen Seite Nothing
hat nicht möglich Wert - siehe Bottom type.
Eine Funktion, die nichts zurückgibt, muss den Rückgabetyp Unit
haben. Wenn es Nothing
wäre, könnte die Funktion kein Ergebnis zurückgeben. Die einzige Möglichkeit, die Funktion zu verlassen, wäre eine Ausnahme.
Nothing
wird auf eine andere Weise verwendet. Er wird durch zwei Eigenschaften aus:
Nothing
ein Subtyp von jedem anderen Typ (einschließlichNull
).- Es gibt keine Instanzen dieses Typs.
Wann ist das nützlich? Betrachten None
:
object None extends Option[Nothing]
Da Option
in seiner Art Parametern covariant und Nothing
ist ein Subtyp von allem, Option[Nothing]
ist ein Subtyp von Option[A]
für jede Art A
. Also können wir ein Objekt None
machen, das ein Subtyp von Option[A]
für jeden A
ist. Dies ist sinnvoll, da Nothing
nicht instanziiert werden kann, so dass Option[Nothing]
immer ohne Wert ist. Ähnlich
object Nil extends List[Nothing]
Unit
entspricht logisch wahr und Nothing
entspricht logisch falsch unter dem Curry-Howard isomorphism, wo wir Typen wie Sätze und Funktionen als Beweise sehen.
Unit
bedeutet, dass (a) Funktion hat Nebenwirkungen wie Eingang und Ausgang, (b) diese Nebenwirkungen sind das Hauptziel der Funktion. Natürlich kann die Funktion Nebenwirkungen haben, auch wenn der Typ sich von Unit
unterscheidet.
Nothing
ist ein spezieller Typ in Scala, weil (a) es keine Werte hat (Einheit hat exectly einen Wert - ()
), so dass Sie nicht Wert vom Typ zurückgeben Nothing
und (b) es ist ein Subtyp von allen anderen Typen ist . Das heißt, wenn etwas vom Typ Nothing
ist, kann es überall dort verwendet werden, wo ein anderer Typ benötigt wird, aber es wird kein Ergebnis liefern. Dies wird für den Umgang mit Ausnahmen verwendet - throw
Ausdruck hat eine Art von Nothing
, so dass es grundsätzlich überall in einem Programm verwendet werden kann.
Einfach, Nothing
bedeutet, dass es einen Fehler gab und nichts zurückgegeben wurde, während Unit
bedeutet, dass es Nebenwirkungen gab.
Programming in Scala hat eine schöne Erklärung davon.
Um einen Aspekt zu Petrs Antwort hinzuzufügen: Nothing
spielt eine wichtige Rolle in der Typhierarchie. Es ist ein Bottom-Typ. Das bedeutet, dass es ein Subtyp von jedem anderen Typ ist, der wie das Gegenteil von Any
ist, was ein Supertyp von allem ist. Sie können eine schöne Erklärung here finden.
- 1. Was ist der Unterschied zwischen "Null" und "Nichts" in VB6?
- 2. Was ist der Unterschied zwischen null, 0 und nichts?
- 3. Was ist der Unterschied zwischen `==` und `ist`?
- 4. Was ist der Unterschied zwischen:.! und: r !?
- 5. Was ist der Unterschied zwischen Difftime und '-'?
- 6. Was ist der Unterschied zwischen $ und $$?
- 7. Was ist der Unterschied zwischen Verilog! und ~?
- 8. was ist der Unterschied zwischen [[], []] und [[]] * 2
- 9. Was ist der Unterschied zwischen/* ... */und/** ... */
- 10. Was ist der Unterschied zwischen `&` und `ref`?
- 11. Was ist der Unterschied zwischen $ (...) und `...`
- 12. Was ist der Unterschied zwischen .Equals und ==
- 13. Was ist der Unterschied zwischen "$^N" und "$ +"?
- 14. Was ist der Unterschied zwischen + = und = +?
- 15. Was ist der Unterschied zwischen? und ? = Nil
- 16. Was ist der Unterschied zwischen $ (()) und Ausdruck?
- 17. Was ist der Unterschied zwischen:
- 18. Was ist der Unterschied zwischen ConditionPathExists = und ConditionPathExists = | in systemd?
- 19. Was ist der Unterschied zwischen DbContext und Object
- 20. Was ist der Unterschied zwischen openGL und EAGL/openAL?
- 21. Was ist der Unterschied zwischen launchscreen.storyboard und main.storyboard
- 22. Was ist der Unterschied zwischen Tests und Spezifikationen?
- 23. Was ist der Unterschied zwischen der JSP und der JSTL?
- 24. Was ist der Unterschied zwischen CTS und GTS?
- 25. Was ist der Unterschied zwischen XOR und NOT-EQUAL-TO?
- 26. Was ist der Unterschied zwischen Cookie und Cookiejar?
- 27. Was ist der Unterschied zwischen Renderings und Sublayouts in Sitecore
- 28. Was ist der Unterschied zwischen android.opengl und javax.microedition.khronos.opengles Paketen?
- 29. Was ist der Unterschied zwischen "falsch" und "nein" in Prolog
- 30. Was ist der Unterschied zwischen NetFx45WebLink und NetFx45RedistLink ist
@ downvoters: Als ich diese Antwort schrieb, erwähnte Petr in der Antwort überhaupt nicht den unteren Typaspekt. Er fügte es erst später hinzu. – bluenote10