Variadische Funktionen (...)
Teil des Abschnitts Logic & Flow der Lua-Journey von Coddy — Lektion 11 von 54.
Manchmal benötigen Sie eine Funktion, die mit einer beliebigen Anzahl von Argumenten arbeiten kann. Vielleicht möchten Sie die Summe von zwei Zahlen berechnen, oder von drei, oder von zehn – ohne für jeden Fall separate Funktionen zu schreiben. Lua bietet hierfür eine spezielle Syntax an: die drei Punkte ...
Wenn Sie ... in der Parameterliste einer Funktion platzieren, wird sie zu einer variadischen Funktion, die eine beliebige Anzahl von Argumenten akzeptiert:
function sum(...)
-- Funktionskörper
endInnerhalb der Funktion können Sie auf diese Argumente zugreifen, indem Sie erneut ... verwenden. Um einfacher mit ihnen zu arbeiten, können Sie diese mithilfe von geschweiften 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. Sie können dann wie durch jede andere Tabelle iterieren, indem Sie den Längenoperator # oder ipairs() verwenden.
Aufgabe
EinfachSchreiben Sie eine Funktion calculateAverage, die eine beliebige Anzahl von numerischen Argumenten akzeptiert und deren Durchschnitt zurückgibt.
Verwenden Sie die variadische Syntax ..., um eine flexible Anzahl von Argumenten zu akzeptieren, packen Sie diese in eine Tabelle, berechnen Sie deren Summe und teilen Sie diese durch die Anzahl.
Hinweis: Der Starter-Code (markiert mit "Don't touch this code") liest Zahlen aus der Eingabe, konvertiert jede einzelne mit tonumber() von Text in eine Zahl und speichert sie in einer Tabelle namens numbers. Am Ende ruft er Ihre Funktion mit unpack(numbers) auf, wodurch die Werte der Tabelle als einzelne Argumente übergeben werden — Ihre Funktion empfängt diese also als .... Sie müssen diesen Code nicht im Detail ändern oder verstehen; konzentrieren Sie sich einfach auf das Schreiben von calculateAverage.
Logik:
- Packen Sie alle Argumente mit
{...}in eine Tabelle - Iterieren Sie durch die Tabelle, um die Summe aller Zahlen zu berechnen
- Teilen Sie die Summe durch die Anzahl der Argumente, um den Durchschnitt zu erhalten
- Geben Sie den Durchschnitt als Zahl zurück
Parameter:
...(numbers): Variable Anzahl an numerischen Argumenten
Rückgabewert: Der Durchschnitt aller angegebenen Zahlen (number)
Spickzettel
Lua unterstützt variadische Funktionen, die eine beliebige Anzahl von Argumenten unter Verwendung der Syntax mit drei Punkten ... akzeptieren können:
function sum(...)
-- Funktionskörper
endPacken Sie innerhalb einer variadischen Funktion die Argumente mit {...} in eine Tabelle:
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, die alle Argumente enthält. Sie können diese mit dem Längenoperator # oder ipairs() durchlaufen.
Probier es selbst
-- Diesen Code nicht ändern --
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(...)
-- Code hier schreiben
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 Logic & Flow
1Fortgeschrittene Table-Iteration
Iterieren mit pairs()Iterieren mit ipairs()pairs() vs. ipairs()Zusammenfassung – Charakterbogen4Einführung in Metatables
Was ist eine Metatable?setmetatable & getmetatableDie __index-MetamethodeDie __newindex-MetamethodeDie __tostring-MetamethodeArithmetische Metamethoden Teil 1Arithmetische Metamethoden Teil 2Zusammenfassung – Schreibgeschützte Tabellen7Fortgeschrittene String-Manipulation
string.gsub() für ErsetzungenEinführung in String-Patternsstring.find()string.match()Iterieren mit string.gmatch()Rückblick – Log-File-Parser2Weitere Funktionen der Table-Bibliothek
table.concat()Tabellenerstellung & unpack()table.sort()Benutzerdefiniertes Sortieren mit FunktionenRückblick – Highscore-Tabelle3Fortgeschrittene Funktionskonzepte
Mehrere RückgabewerteVariadische Funktionen (...)Funktionen als First-Class ValuesAnonyme FunktionenWas ist eine Closure?Zusammenfassung – Einfacher Event Handler