Variadische Funktionen (...)
Teil des Abschnitts Logik & Programmablauf der Lua-Journey von Coddy. Lektion 11 von 54.
Manchmal benötigst du eine Funktion, die mit einer beliebigen Anzahl von Argumenten arbeiten kann. Vielleicht möchtest du die Summe von zwei, drei oder zehn Zahlen berechnen, ohne für jeden Fall separate Funktionen zu schreiben. Lua stellt dafür eine spezielle Syntax bereit: die drei Punkte ...
Wenn du ... in die Parameterliste einer Funktion einfügst, wird sie zu einer variadischen Funktion, die eine beliebige Anzahl von Argumenten akzeptiert:
function sum(...)
-- Funktionskörper
endInnerhalb der Funktion kannst du auf diese Argumente zugreifen, indem du erneut ... verwendest. Um einfacher mit ihnen zu arbeiten, kannst du sie mithilfe geschweifter Klammern in eine Tabelle packen:
function sum(...)
local args = {...}
local total = 0
for i = 1, #args do
total = total + args[i]
end
return total
end
print(sum(5, 10, 15)) -- Ausgabe: 30
print(sum(1, 2, 3, 4, 5)) -- Ausgabe: 15Der Ausdruck {...} erstellt eine Tabelle im Listenstil, die alle an die Funktion übergebenen Argumente enthält. Du kannst anschließend wie bei jeder anderen Tabelle über diese Tabelle iterieren, indem du den Längenoperator # oder ipairs() verwendest.
Aufgabe
EinfachSchreibe eine Funktion calculateAverage, die eine beliebige Anzahl numerischer Argumente akzeptiert und deren Durchschnitt zurückgibt.
Verwende die Variadic-Syntax ..., um eine flexible Anzahl von Argumenten zu akzeptieren, sie in eine Tabelle zu packen, ihre Summe zu berechnen und durch die Anzahl zu teilen.
Hinweis: Der Startcode (markiert mit „Diesen Code nicht ändern“) liest Zahlen aus der Eingabe, wandelt jede einzelne mithilfe von tonumber() von Text in eine Zahl um und speichert sie in einer Tabelle namens numbers. Am Ende ruft er deine Funktion mit unpack(numbers) auf, wodurch die Werte der Tabelle als einzelne Argumente übergeben werden, sodass deine Funktion sie als ... erhält. Du musst diesen Code weder im Detail ändern noch verstehen; konzentriere dich einfach darauf, calculateAverage zu schreiben.
Logik:
- Packe alle Argumente mithilfe von
{...}in eine Tabelle - Durchlaufe die Tabelle, um die Summe aller Zahlen zu berechnen
- Teile die Summe durch die Anzahl der Argumente, um den Durchschnitt zu erhalten
- Gib den Durchschnitt als Zahl zurück
Parameter:
...(Zahlen): Variable Anzahl numerischer Argumente
Rückgabe: Der Durchschnitt aller bereitgestellten Zahlen (Zahl)
Probier es selbst
-- Diesen Code nicht anfassen --
local numbers = {}
while true do
local input = io.read()
if input == nil or input == "" then
break
end
local num = tonumber(input)
if num then
table.insert(numbers, num)
end
end
-------------------------
function calculateAverage(...)
-- Schreibe hier den Code
end
local average = calculateAverage(unpack(numbers))
print("Average: " .. average)
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Programmablauf
1Fortgeschrittene Tabelleniteration
Iterieren mit pairs()Iterieren mit ipairs()pairs() vs. ipairs()Zusammenfassung – Charakterbogen2Weitere Funktionen der Tabellenbibliothek
table.concat()Tabellenkonstruktion & unpack()table.sort()Eigene Sortierung mit FunktionenRückblick – Highscore-Tabelle3Fortgeschrittene Funktionskonzepte
Mehrere Werte zurückgebenVariadische Funktionen (...)Funktionen als Werte erster KlasseAnonyme FunktionenWas ist eine Closure?Rückblick – Einfacher Event-HandlerÜbe selbstständig: Online-Lua-Compiler