Menu
CoddyTech

Variadische Funktionen (...)

Teil des Abschnitts Logik und Programmablauf der Lua-Journey von Coddy. Lektion 11 von 54.

Manchmal brauchst 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 eine eigene Funktion zu schreiben. Lua bietet dafür eine besondere Syntax: die drei Punkte ...

Wenn du ... in die Parameterliste einer Funktion einfügst, wird daraus eine Funktion mit variabler Argumentanzahl, die beliebig viele Argumente akzeptiert:

function sum(...)
    -- Funktionskörper
end

Innerhalb der Funktion kannst du mit ... wieder auf diese Argumente zugreifen. Damit du leichter mit ihnen arbeiten kannst, 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: 15

Der Ausdruck {...} erstellt eine Tabelle im Listenstil, die alle an die Funktion übergebenen Argumente enthält. Anschließend kannst du wie durch jede andere Tabelle iterieren, indem du den Längenoperator # oder ipairs() verwendest.

Das funktioniert, solange kein Argument nil ist. Ein nil lässt eine Lücke in der Tabelle, und # ist bei einer Tabelle mit Lücken nicht zuverlässig. select("#", ...) gibt immer die Anzahl der Argumente zurück, einschließlich der nil-Argumente:

function countArgs(...)
    return select("#", ...)
end

print(countArgs(10, 20, 30))        -- Ausgabe: 3
print(countArgs(10, nil, 30, nil))  -- Ausgabe: 4
challenge icon

Aufgabe

Einfach

Schreibe eine Funktion calculateAverage, die eine beliebige Anzahl numerischer Argumente akzeptiert und ihren Durchschnitt zurückgibt.

Verwende die Variadic-Syntax ..., um eine flexible Anzahl von Argumenten zu akzeptieren, sie in einer Tabelle zu bündeln, ihre Summe zu berechnen und durch die Anzahl zu teilen.

Hinweis: Der Startcode (gekennzeichnet mit "Don't touch this code") 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 ... empfängt. Du musst diesen Code weder ändern noch im Detail verstehen; konzentriere dich einfach darauf, calculateAverage zu schreiben.

Logik:

  • Bündle alle Argumente mithilfe von {...} in einer 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): Eine variable Anzahl numerischer Argumente

Rückgabe: Der Durchschnitt aller angegebenen Zahlen (Zahl)

Probier es selbst

-- Diesen Code nicht verä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(...)
    -- Schreibe hier Code
end
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logik und Programmablauf

Übe selbstständig: Online-Lua-Compiler