Rückgabewerte
Die Funktionen, die du bisher geschrieben hast, geben etwas aus, und das war es. Oft soll eine Funktion aber einen Wert berechnen, mit dem das Programm weiterarbeiten kann: addieren, vergleichen oder speichern. Dann gibt die Funktion den Wert mit return zurück:
local function erntewert(anzahl, preis)
return anzahl * preis
end
local karotten = erntewert(12, 5)
print("Karotten: " .. karotten .. " Münzen")
print("Kürbisse: " .. erntewert(4, 20) .. " Münzen")Das gibt Folgendes aus:
Karotten: 60 Münzen
Kürbisse: 80 MünzenDer Aufruf erntewert(12, 5) führt die Funktion aus, und return schickt 60 an die Stelle des Aufrufs zurück. Du kannst dir vorstellen, dass Lua den Aufruf durch den zurückgegebenen Wert ersetzt, aus local karotten = erntewert(12, 5) wird also local karotten = 60. Dieser Wert ist der Rückgabewert der Funktion. Du kannst einen Aufruf überall verwenden, wo du einen Wert schreiben würdest: in einer Variable, in print, in einer Rechnung oder in einer Bedingung wie if erntewert(12, 5) > 50 then. Solche Funktionen kennst du schon: math.max(3, 8) gibt 8 zurück, und tostring(5) gibt "5" zurück.
return beendet außerdem sofort die Funktion. Zusammen mit Bedingungen ergibt das kurze Funktionen, die in verschiedenen Fällen verschiedene Werte zurückgeben:
local function verkaufspreis(pflanze)
if pflanze == "Karotte" then
return 5
elseif pflanze == "Kartoffel" then
return 8
end
return 0
end
print(verkaufspreis("Kartoffel"), verkaufspreis("Karotte"), verkaufspreis("Stein"))Das gibt Folgendes aus:
8 5 0Für "Kartoffel" wird das zweite return ausgeführt, und die Funktion endet: Lua kommt nie zu return 0. Dorthin kommt es nur, wenn keine Bedingung wahr ist. In Lua muss return die letzte Zeile seines Blocks sein (direkt vor end, else oder elseif). Eine Zeile danach im selben Block ist ein Syntaxfehler: 'end' expected … near 'print'.
Anfänger verwechseln oft print und return, weil beide scheinbar einen Wert herausgeben. Aber print zeigt dir den Wert nur in der Ausgabe, und das Programm kann nicht damit arbeiten. return gibt den Wert an das Programm. Sieh dir eine Funktion an, die ihr Ergebnis ausgibt, statt es zurückzugeben:
local function erntewert(anzahl, preis)
print(anzahl * preis)
end
local karotten = erntewert(12, 5)
print(karotten)
print(karotten + 10)Das gibt Folgendes aus:
60
nil
main.lua:7: attempt to perform arithmetic on a nil value (local 'karotten')Die 60 kommt vom print in der Funktion. Aber die Funktion hat nichts zurückgegeben, also ist karotten gleich nil, und die Rechnung endet mit einem Fehler. Wenn du nil siehst, wo du das Ergebnis einer Funktion erwartet hast, prüfe, ob die Funktion ein return hat. Eine gute Regel: Eine Funktion, die etwas berechnet, gibt das Ergebnis zurück, und der Code, der sie aufruft, entscheidet, ob er es ausgibt, speichert oder weiterrechnet.
So schreibst du es:
Anweisungen
- 1
Das Programm gibt
60und32aus und endet dann mit dem Fehlermain.lua:8: attempt to perform arithmetic on a nil value (local 'karotten'). Die Funktionverkaufgibt den Preis aus, statt ihn zurückzugeben. Behebe das, damit das ProgrammSumme: 92 Münzenausgibt. - 2
Schreibe am Ende des Programms eine Funktion
verkaufspreismit einem Parameterpflanze. Sie gibt zurück, wie viele Münzen Emma für ein Stück bekommt:5für"Karotte",8für"Kartoffel",20für"Kürbis"und0für alles andere. Gib dannverkaufspreis("Kürbis"),verkaufspreis("Karotte")undverkaufspreis("Stein")mit einem einzigenprintaus. Das Programm gibt Folgendes aus:20 5 0 - 3
Jetzt benutzt du beide Funktionen zusammen. Füge am Ende des Programms die Listen mit dem hinzu, was Emma heute verkauft hat:
local pflanzen = {"Karotte", "Kartoffel", "Kürbis", "Karotte"} local mengen = {10, 5, 2, 4}Gehe die Listen mit einer
for-Schleife durch und addiere für jedesiden Wert vonverkauf(mengen[i], verkaufspreis(pflanzen[i])). Lua ruft zuerstverkaufspreisauf und übergibt den Preis, den es zurückgibt, anverkauf. Gib nach der Schleife die Summe aus:Marktsumme: 150 Münzen.