Es mehrere Verwendungen hat. Es kann für Funktionen verwendet werden, die das Programm in Panik versetzen oder das Programm verlassen. panic!()
selbst ist eine solche Funktion, aber es kann auch auf Funktionen angewendet werden, die panic!()
umhüllen, wie das Ausgeben detaillierterer Fehlerinformationen und dann Panik.
Es kann auch für Funktionen verwendet werden, die nie zurückkehren. Wenn eine Funktion in eine Endlosschleife wie die Hauptschleife eines Servers übergeht und daher niemals zurückkehrt, könnte sie auf diese Weise definiert werden.
Eine andere mögliche Verwendung wäre ein Wrapper um den Unix exec
family of functions, in dem der aktuelle Prozess durch den aktuellen Prozess ersetzt wird.
Es ist nützlich, einen solchen Typ zu haben, weil er mit allen anderen Typen kompatibel ist. Um typsicher zu sein, muss Rust sicherstellen, dass alle Zweige einer match
oder if
Anweisung den gleichen Typ zurückgeben. Wenn jedoch einige Zweige nicht erreichbar sind oder einen Fehler anzeigen, müssen Sie einen Fehler erzeugen, der mit dem von den anderen Zweigen zurückgegebenen Typ übereinstimmt. Da !
mit allen Typen vereint ist, kann es in jedem Fall verwendet werden.
Es gibt ein interesting RFC (und discussion) zur Zeit, die (teilweise) für expanding the places where !
can be used argumentiert Streiten, dass es als ein vollwertiges Typ wie ()
ist behandelt werden sollte; !
ist ein Typ ohne Werte, der mit allen anderen Typen vereinheitlicht, während ()
ein unterschiedlicher Typ mit einem einzelnen Wert ist. Ich bin mir nicht sicher, ob ich dem vollständigen RFC zustimme, aber die Diskussion, !
als einen vollwertigen Typ zu behandeln, ist interessant und ich denke, dass er separat vom Rest des RFC vorgeschlagen werden könnte.
aktualisieren: Da ich die oben geschrieben, der Teil des RFC über !
zu einer vollwertigen Art der Förderung war split into a separate RFC and merged und ist in the process of being implemented (derzeit in jeder Nacht hinter einem Feature-Gate baut). Als vollwertiger Typ kann er in mehreren Kontexten verwendet werden, wie z. B. in Result<T, !>
, das ein Ergebnis anzeigt, das niemals fehlschlagen kann, oder Result<!, E>
als eines, das niemals erfolgreich sein kann. Diese sind nützlich in generischen Kontexten; Wenn Sie eine Eigenschaft haben, die eine Methode erfordert, um ein Ergebnis zurückzugeben, aber für diese bestimmte Implementierung nur erfolgreich sein kann, müssen Sie keinen Dummy-Fehlertyp eingeben.
Meine Favoriten sind 'unimplemented!()' Und 'unreachable!()'. – Shepmaster