Mehrere Rückgabewerte
In vielen Sprachen gibt eine Funktion höchstens einen Wert zurück. In Lua kann return mehrere zurückgeben, getrennt durch Kommas. Emma schreibt auf, wie viele Minuten ihre Arbeit auf dem Hof dauert, und diese Funktion macht aus Minuten Stunden und Minuten:
local function stundenUndMinuten(minuten)
return minuten // 60, minuten % 60
end
local stunden, rest = stundenUndMinuten(135)
print(stunden .. " Std. " .. rest .. " Min.")Das gibt Folgendes aus:
2 Std. 15 Min.Der Aufruf gibt zwei Werte zurück, und sie kommen der Reihe nach in die Variablen: der erste in stunden, der zweite in rest. Lua kann überall mehrere Variablen auf einmal zuweisen, nicht nur bei Funktionen: local a, b = 1, 2. Gibt es mehr Variablen als Werte, bekommen die überzähligen Variablen nil; überzählige Werte werden weggeworfen. Brauchst du nur den zweiten Wert, schreibst du _ an die Stelle des ersten, wie bei ipairs: local _, rest = stundenUndMinuten(135).
print gibt alle Werte aus, die eine Funktion zurückgibt, getrennt durch Tabulatoren. Aber sieh, was passiert, wenn der Aufruf nicht an letzter Stelle steht:
local function stundenUndMinuten(minuten)
return minuten // 60, minuten % 60
end
print(stundenUndMinuten(135))
print(stundenUndMinuten(135), "Stunden")
print((stundenUndMinuten(135)))Das gibt Folgendes aus:
2 15
2 Stunden
2Ein Aufruf liefert alle seine Werte nur, wenn er das letzte (oder einzige) Element einer Liste von Werten ist, wie die Argumente von print. Überall sonst wird nur sein erster Wert benutzt, deshalb gibt die zweite Zeile 2 und Stunden aus, und die 15 geht verloren. Zusätzliche Klammern um einen Aufruf, wie in der dritten Zeile, behalten ebenfalls nur den ersten Wert.
Mehrere Rückgabewerte sind praktisch, wenn eine Funktion mehrere Dinge auf einmal herausfindet. Diese Funktion geht eine Liste einmal durch und gibt sowohl die kleinste als auch die größte Zahl zurück:
local function kleinsteUndGroesste(liste)
local kleinste = liste[1]
local groesste = liste[1]
for _, wert in ipairs(liste) do
kleinste = math.min(kleinste, wert)
groesste = math.max(groesste, wert)
end
return kleinste, groesste
end
local niedrig, hoch = kleinsteUndGroesste({7, 3, 9, 4})
print("Von " .. niedrig .. " bis " .. hoch)Das gibt Folgendes aus:
Von 3 bis 9Ohne mehrere Rückgabewerte bräuchtest du zwei Funktionen, und die Liste würde zweimal durchgegangen. Beide Werte gehören zu einem einzigen return, getrennt durch ein Komma. Zwei return hintereinander funktionieren nicht: Das erste würde die Funktion beenden, und Lua erlaubt nach return nicht einmal eine weitere Zeile.
So schreibst du es:
Anweisungen
- 1
Emma packt Eier in Schachteln zu je 6. Das Programm endet mit dem Fehler
attempt to call a nil value (global 'packeEier'), weil es die Funktion noch nicht gibt. Schreibe sie über der Schleife:packeEierhat einen Parametereierund gibt zwei Werte zurück: wie viele volle Schachteln mit 6 Eiern Emma füllt und wie viele Eier übrig bleiben. Das Programm gibt dann Folgendes aus:Tag 1: 3 Schachteln, 2 übrig Tag 2: 5 Schachteln, 1 übrig Tag 3: 2 Schachteln, 0 übrig Tag 4: 3 Schachteln, 0 übrig Tag 5: 4 Schachteln, 1 übrig - 2
Schreibe unter der Schleife eine Funktion
summeUndDurchschnittmit einem Parameterliste. Sie gibt zwei Werte zurück: die Summe der Zahlen in der Liste und ihren Durchschnitt. Benutze sie fürwocheund dann für die Liste{6, 9}, und gib die Ergebnisse so aus:Summe: 106, Durchschnitt: 21.2 Summe: 15, Durchschnitt: 7.5