Funktionen können Aktionen durchführen. So kann dir eine Funktion unter anderem einen Wert zurückgeben, wenn du sie aufrufst. Der Wert ist dann das Ergebnis.
Wenn du beispielsweise GetRandomInt(1, 10) aufrufst, erwartest du, damit eine zufällige Ganzzahl zwischen 1 und 10 zu holen.
Um den Typ des Wertes zu ändern, den du von deiner Funktion wünschst, würdest du den Typ in der Funktionssignatur ändern. Beispiel:
GetNumberOfMousetrapsYouCanAfford() : int
In diesem Beispiel hat GetNumberOfMousetrapsYouCanAfford() den Rückgabetyp int. Wenn du also GetNumberOfMousetrapsYouCanAfford() in deinem Code aufrufst, kannst du erwarten, dass er eine Ganzzahl zurückgibt.
GetNumberOfMousetrapsYouCanAfford() : float
Wenn du hingegen den Typ in Float änderst, wird ein anderer Wert zurückgegeben.
Wenn in deiner Funktion ein Rückgabe-Typ angegeben ist, muss der Funktionskörper (Codeblock) ein Ergebnis erzeugen, das mit diesem Typ übereinstimmt. Sonst lässt sich der Code nicht kompilieren – du hast also einen Compiler-Fehler. Möchtest du lernen, wie man das vermeidet?
Ergebnisse und Rückgaben
Das Ergebnis ist der Wert, den eine Funktion bei der Rückgabe liefert, wenn sie ausgeführt wird (läuft).
In
In Verse ist return (Rückgabe) auch ein Schlüsselwort, das einer Funktion befiehlt, den Wert zu liefern, der sich aus dem Ausdruck ergibt, der auf das Schlüsselwort `return` folgt.
MyFunction() : int =
return 5
OnBegin<override>()<suspend> : void =
MyFunction() # result is 5
Im obigen Beispiel wird dieser Code den Wert 5 zurückgeben, wenn MyFunction() aufgerufen wird.
Wenn man return auslässt, wird deine Funktion dadurch nicht fehlerhaft. Das Schlüsselwort return explizit einzufügen, ist jedoch eine gute Vorgehensweise. Mehr dazu findest du bei Interesse unter Funktionen.
Frühzeitige Rückgaben
Wenn dein Programm einen Rückgabe -Ausdruck ausführt, wird das Programm sofort den Funktionscodeblock verlassen. Das bedeutet, dass der nachfolgende Code nicht ausgeführt wird, wenn du den Rückgabe-Ausdruck vor anderem Code platzierst. Das kann sinnvoll sein, um eine Funktion frühzeitig zu verlassen, wenn eine spezifische Bedingung erfüllt wird.
Die folgende Funktion aktualisiert die Variable Coins basierend auf CoinsPerMouseTrap. Die Variable Coins muss allerdings einen positiven Wert haben, um eine Mausefalle zu kaufen. Wenn Coins negativ ist, gibt die Funktion eine Fehlermeldung aus und geht sofort zur Rückgabe über, da es keinen Grund gibt, den restlichen Code im Funktionskörper auszuführen.
Denn ohne Rückgabe würde die Funktion den Wert von Coins falsch reduzieren und nie angeben, dass Coins negativ war.
var Coins : int = -10
CoinsPerMousetrap : int = 100
BuyMousetrap() : void =
if (Coins < 0):
Print("Error: Coins set to negative value")
return
set Coins = Coins - CoinsPerMousetrap
Print(“Mousetrap bought! You have {Coins} coins left.”)
Eine Funktion frühzeitig mit return zu verlassen, kann zu Bugs führen, weshalb du es vorsichtig einsetzen solltest. Da return im folgenden Code beispielsweise vor Print("Du hast eine Mausefalle gekauft! Du hast {Coins} noch Münzen übrig.") ausgeführt wird, wird die Funktion den neuen Wert von Coins nie ausgeben.
var Coins : int = 500
CoinsPerMousetrap : int = 100
BuyMousetrap() : void =
if (Coins < 0):
Print("Error: Coins set to negative value")
return
set Coins = Coins - CoinsPerMousetrap
return
Print("Mousetrap bought! You have {Coins} coins left.")
Wenn du in deinem Code eine frühzeitige Rückgabe hast, wird dein Code zwar trotzdem kompiliert; aber Visual Studio Code warnt dich dann, dass die Ausdrücke nach der Rückgabe nicht ausgeführt werden.
Void für Funktionen ohne nützliches Ergebnis
Mal will man ein Ergebnis, mal nicht.
Erinnerst du dich an die Typen in Lektion 2? Dann erinnerst du dich vielleicht auch noch daran, dass jeder Typ eine bestimmte Art von Wert erfordert. Die unten stehende Liste ist sehr kurz. Sie umfasst nur die gängigsten der vielen in Verse verwendeten Typen, welche die Grundlage zur Verwendung von Variablen und Konstanten sind.
| Typ | Was es tut | Werte |
|---|---|---|
| Dieser Werttyp kann nur „true“ oder „false“ sein. | true/false |
| Ein Integer ist eine Ganzzahl (kein Bruchteil), und | Ganzzahlen |
| Dieser Typ ist für Werte gedacht, die keine ganzen Zahlen sind, wie z. B. Brüche. | Zahlen mit Dezimalpunkt |
| Dieser Typ ist für jede Art von Text. Das können Buchstaben, Zahlen, Satzzeichen, Leerzeichen und sogar Emojis sein. 😻 | Buchstaben, Zahlen, Satzzeichen, Leerzeichen, Emojis |
Wenn du eine Funktion erstellst, die kein Ergebnis liefern muss, kannst du den Rückgabe-Typ der Funktion auf void setzen.
Das bedeutet, dass der letzte Ausdruck im Codeblock ein Ergebnis beliebigen Typs erzeugen kann, ohne einen Compilerfehler zu erzeugen, da der Typ für die Funktion auf void gesetzt ist.
Du kannst für Funktionen mit dem Typ „void“ trotzdem das Schlüsselwort return verwenden – du musst mit dem Schlüsselwort return bloß keinen Wert angeben.
Zusammenfassung
Das Ergebnis ist das, was du von einer Funktion zurückbekommst, wenn du sie aufrufst.
In einem Codeblock erzeugt der letzte Ausdruck das Ergebnis.
Um den Werttyp in einer Funktion zu ändern, müsstest du den Typ in der Funktionssignatur ändern.
„Return“ (Rückgabe) ist ein Schlüsselwort, das der Funktion befiehlt, den Wert zu liefern, der sich aus dem nachfolgenden Ausdruck ergibt.
Eine frühzeitige Rückgabe beschreibt einen Fall, in dem das Schlüsselwort „return“ in einem Codeblock vor dem Blockende verwendet wird. Dadurch wird das Programm diesen Codeblock sofort verlassen, ohne den restlichen Code im Block auszuführen.
Void ist ein Typ, der besagt, dass der Wert der Funktion nirgendwo sonst verwendet wird. Oder dass sie schlichtweg ignoriert werden kann. Du kannst `void` als Typ für eine Funktion verwenden, die kein Ergebnis erzeugen muss.