Ich habe gerade gelesen: http://oldfashionedsoftware.com/2008/08/20/a-post-about-nothing/
Soweit ich weiß, Null
ist dies ein Merkmal und seine einzige Instanz ist null
.
Wenn eine Methode ein Null-Argument akzeptiert, können wir ihr nur eine Null
Referenz oder null
direkt übergeben, aber keine andere Referenz, selbst wenn sie ( nullString: String = null
zum Beispiel) null ist .
Ich frage mich nur, in welchen Fällen die Verwendung dieses Null
Merkmals nützlich sein könnte. Es gibt auch das Merkmal Nichts, für das ich keine Beispiele mehr sehe.
Ich verstehe auch nicht wirklich, was der Unterschied zwischen der Verwendung von Nothing und Unit als Rückgabetyp ist, da beide kein Ergebnis zurückgeben. Woher weiß ich, welches ich verwenden soll, wenn ich eine Methode habe, die beispielsweise die Protokollierung durchführt?
Haben Sie die Verwendung von Unit / Null / Nothing als etwas anderes als einen Rückgabetyp?
Der Artikel, den Sie zitieren, kann irreführend sein. Der
Null
Typ dient der Kompatibilität mit der virtuellen Java-Maschine und insbesondere mit Java .Wir müssen diese Scala berücksichtigen :
null
Verweise verarbeiten, um auf Java-Bibliotheken und Code zuzugreifenDaher wird es notwendig, einen Typ für den
null
Wert zu definieren , der dasNull
Merkmal ist undnull
dessen einzige Instanz ist.Der
Null
Typ ist nur dann besonders nützlich, wenn Sie das Typsystem sind oder auf dem Compiler entwickeln. Insbesondere sehe ich keinen vernünftigen Grund, einenNull
Typparameter für eine Methode zu definieren , da Sie nur etwas anderes übergeben könnennull
quelle
Unit
kann wie folgt verwendet werden:Auf diese Weise können Sie einen beliebigen Codeblock übergeben, der ausgeführt werden soll.
Null
kann als unterster Typ für jeden Wert verwendet werden, der nullwertfähig ist. Ein Beispiel ist folgendes:Nothing
wird in der Definition von verwendetNone
Auf diese Weise können Sie
None
jedem Typ eine zuweisen ,Option
daNothing
alles erweitert wird.quelle
Wenn Sie verwenden
Nothing
, gibt es keine Dinge zu tun (einschließlich Druckkonsole). Wenn Sie etwas tun, verwenden Sie den AusgabetypUnit
... wie man es dann benutzt
Nothing
?quelle
E
in derOption
muss in kovarianter Position sein:trait Option[+E]
um Dinge wieval x: Option[Int] = None
Ich habe den
Null
Typ noch nie verwendet , aber Sie verwenden ihn dortUnit
, wo Sie ihn auf Java verwenden würdenvoid
.Nothing
ist ein besonderer Typ, denn wie Nathan bereits erwähnt hat, kann es keine Instanz von gebenNothing
.Nothing
ist ein sogenannter Bodentyp, was bedeutet, dass es sich um einen Untertyp eines anderen Typs handelt. Dies (und der Parameter für den kontravarianten Typ) ist der Grund, warum Sie einen beliebigen Wert vorNil
- das ist aList[Nothing]
- stellen können, und die Liste wird dann von diesem Elementtyp sein.None
auch wenn vom TypOption[Nothing]
. Jeder Versuch, auf die Werte in einem solchen Container zuzugreifen, löst eine Ausnahme aus, da dies die einzig gültige Möglichkeit ist, von einer Typmethode zurückzukehrenNothing
.quelle
IO[Unit]
zum Drucken auf die Konsole und dergleichen sein.Nichts wird oft implizit verwendet. Im folgenden Code ist
val b: Boolean =
if (1 > 2) false
else throw new RuntimeException("error")
die else- Klausel vom Typ Nothing , einer Unterklasse von Boolean (sowie allen anderen AnyVal). Somit ist die gesamte Zuweisung für den Compiler gültig, obwohl die else- Klausel eigentlich nichts zurückgibt.quelle
Hier ist ein Beispiel
Nothing
vonscala.predef
:Falls Sie nicht vertraut sind (und Suchmaschinen nicht danach suchen können),
???
ist Scalas Platzhalterfunktion für alles, was noch nicht implementiert wurde. Genau wie bei KotlinTODO
.Sie können beim Erstellen von Scheinobjekten denselben Trick verwenden: Nicht verwendete Methoden mit einer benutzerdefinierten
notUsed
Methode überschreiben . Der Vorteil der Nichtverwendung???
besteht darin, dass Sie keine Kompilierungswarnungen für Dinge erhalten, die Sie niemals implementieren möchten.quelle
In Bezug auf die Kategorietheorie ist nichts ein Anfangsobjekt und die Einheit ein Endobjekt .
https://en.wikipedia.org/wiki/Initial_and_terminal_objects
Anfangsobjekte werden auch als coterminal oder universal bezeichnet , und Endobjekte werden auch als final bezeichnet .
Wenn ein Objekt sowohl initial als auch terminal ist , wird es als Nullobjekt oder Nullobjekt bezeichnet .
quelle