Der defer-Ausdruck verzögert die Ausführung von Code, bis der aktuelle Bereich beendet ist. Du kannst den defer-Ausdruck verwenden, um Aufgaben wie das Zurücksetzen von Variablen zu erledigen. Auch wenn der aktuelle Bereich vorzeitig verlassen wird (z. B. durch return oder break), werden die Ausdrücke in einem defer-Block ausgeführt, solange defer vor dem Verlassen angetroffen wird.
Der folgende Code zeigt, wie man defer verwendet, um eine Variable auf Null zurückzusetzen und gleichzeitig dieselbe Variable als Rückgabe-Wert zu verwenden. In dieser Funktion wird RoundScore zurückgegeben und die Ausdrücke im defer-Block werden direkt danach ausgeführt.
Das bedeutet, dass du keine temporäre Variable erstellen musst, um den Wert von RoundScore zu speichern, bevor er auf Null zurückgesetzt wird.
OnRoundEnd<public>() : void =
var ScoreThisRound : int = AddRoundScoreToTotalScore()
Print("In dieser Runde erzielte Punkte: {ScoreThisRound}")
<# Fügt RoundScore zu TotalScore hinzu und setzt RoundScore auf 0 zurück.
Gibt den hinzugefügten RoundScore zurück. #>
AddRoundScoreToTotalScore<public>() : int =
defer:
set RoundScore = 0
UpdateUI()
set TotalScore += RoundScore
return RoundScore
Ausdrucksverwendung aufschieben
Du kannst einen defer-Ausdruck innerhalb eines beliebigen sequenziellen Codeblocks verwenden, wie z. B. einem Block, einer Schleife, einem for-Ausdruck, if-Ausdruck, einer Verzweigung oder sogar einem anderen defer.
Ausdrücke innerhalb eines defer-Blocks müssen unmittelbar (und nicht asynchron) sein – mit einer Ausnahme. Asynchrone Ausdrücke können weiterhin innerhalb eines defer verwendet werden, wenn sie folgendermaßen unmittelbar verwendet werden:
- spawn
branch(wenn sich dasdeferinnerhalb eines asynchronen Blocks befindet, z. B. in einer Coroutine)
Ein defer hat kein Ergebnis und kann nicht als Argument oder als Zuweisungswert verwendet werden.
| defer | defer vor einem Verlassen |
|---|---|
|
|
Klicke auf das Bild, um es zu vergrößern. |
Klicke auf das Bild, um es zu vergrößern. |
Ein defer-Ausdruck wird nur ausgeführt, wenn er vor einem vorzeitigen Abbruch angetroffen wird.
| defer mit vorzeitiger Rückgabe | defer mit abgebrochenem asynchronem Ausdruck |
|---|---|
|
|
Klicke auf das Bild, um es zu vergrößern. |
Klicke auf das Bild, um es zu vergrößern. |
Mehrere defer'-Ausdrücke, die im selben Bereich vorkommen, kumulieren. Die Reihenfolge, in der sie ausgeführt werden, ist die umgekehrte Reihenfolge, in der sie angetroffen werden – First-In-Last-Out (FILO). Da das letzte defer in einem bestimmten Bereich zuerst ausgeführt wird, können sich Ausdrücke innerhalb dieses letzten defer auf einen Kontext (z. B. Variablen) beziehen, der von anderen defer`-Ausdrücken, die früher gefunden und später ausgeführt wurden, bereinigt wird.
Verse hat keine deterministische Zerstörung, aber defer erlaubt ein ähnliches Verhalten wie RAII, um die Bereinigung sicherzustellen.
| Mehrere defer-Ausdrücke in einem Codeblock | Mehrere defer-Ausdrücke in verschiedenen Codeblöcken |
|---|---|
|
|
Klicke auf das Bild, um es zu vergrößern. |
Klicke auf das Bild, um es zu vergrößern. |
Das vorzeitige Verlassen ist innerhalb eines defer-Blocks erlaubt, solange das Verlassen nicht die Kontrolle an außerhalb des defer-Bereichs überträgt. Zum Beispiel ist es erlaubt, eine Schleife mit break innerhalb eines defer zu verwenden, aber dieses break muss die Codeausführung innerhalb des defer-Blocks halten. Es kann sich nicht auf eine Schleife außerhalb des defer-Blocks beziehen.
Alle Variablen, die im äußeren Verschachtelungsbereich eines defer vorkommen, können innerhalb dieses defer-Ausdrucks verwendet werden.
Denke daran, dass defer zum Zeitpunkt des Verlassens des Bereichs zuletzt ausgeführt wird. Das bedeutet, dass der Zustand des Programms (einschließlich der Variablenwerte) zu diesem Zeitpunkt verwendet wird und nicht zu dem Zeitpunkt, an dem das defer angetroffen wird. Der folgende Code wird 10 ausgeben, weil defer sofort ausgeführt wird, nachdem MyScore auf 10 gesetzt wurde.
var MyScore = 5
defer:
Print(MyScore)
set MyScore = 10
Einen defer-Ausdruck als letzten Ausdruck innerhalb eines Bereichs zu verwenden, ist dasselbe, als wenn du ihn gar nicht verwenden würdest. Diese beiden Sätze von Ausdrücken werden zum Beispiel in genau der gleichen Reihenfolge ausgeführt, so dass das defer nicht benötigt wird:
| Ohne defer | Mit defer |
|---|---|
|
|