Menu
CoddyTech

Funkcje wariadyczne (...)

Część sekcji Logika i przepływ programu ścieżki Lua w Coddy. Lekcja 11 z 54.

Czasami potrzebujesz funkcji, która może działać z dowolną liczbą argumentów. Może chcesz obliczyć sumę dwóch, trzech albo dziesięciu liczb, bez pisania osobnych funkcji dla każdego przypadku. Lua zapewnia specjalną składnię do tego celu: trzy kropki ...

Gdy umieścisz ... na liście parametrów funkcji, stanie się ona funkcją wariadyczną, która przyjmuje dowolną liczbę argumentów:

function sum(...)
    -- Ciało funkcji
end

Wewnątrz funkcji możesz uzyskać dostęp do tych argumentów, ponownie używając .... Aby łatwiej z nimi pracować, możesz spakować je do tablicy, używając nawiasów klamrowych:

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))  -- Wynik: 30
print(sum(1, 2, 3, 4, 5))  -- Wynik: 15

Wyrażenie {...} tworzy tablicę w formie listy zawierającą wszystkie argumenty przekazane do funkcji. Następnie możesz iterować po tej tablicy jak po każdej innej, używając operatora długości # lub ipairs().

To działa, o ile żaden argument nie ma wartości nil. Wartość nil pozostawia lukę w tablicy, a operator # nie działa niezawodnie w przypadku tablicy z lukami. select("#", ...) zawsze zwraca liczbę argumentów, wliczając te o wartości nil:

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

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

Wyzwanie

Łatwy

Napisz funkcję calculateAverage, która przyjmuje dowolną liczbę argumentów numerycznych i zwraca ich średnią.

Użyj składni wariadycznej ..., aby przyjmować zmienną liczbę argumentów, spakować je do tabeli, obliczyć ich sumę i podzielić ją przez ich liczbę.

Uwaga: Kod początkowy (oznaczony jako "Don't touch this code") odczytuje liczby z wejścia, konwertuje każdą z nich z tekstu na liczbę za pomocą tonumber() i zapisuje je w tabeli o nazwie numbers. Na końcu wywołuje Twoją funkcję, używając unpack(numbers), co przekazuje wartości z tabeli jako osobne argumenty, dzięki czemu Twoja funkcja otrzymuje je jako .... Nie musisz modyfikować ani szczegółowo rozumieć tego kodu; skup się tylko na napisaniu funkcji calculateAverage.

Logika:

  • Spakuj wszystkie argumenty do tabeli za pomocą {...}
  • Przejdź przez tabelę, aby obliczyć sumę wszystkich liczb
  • Podziel sumę przez liczbę argumentów, aby uzyskać średnią
  • Zwróć średnią jako liczbę

Parametry:

  • ... (liczby): Zmienna liczba argumentów numerycznych

Zwraca: Średnią wszystkich podanych liczb (liczba)

Spróbuj swoich sił

-- Nie zmieniaj tego kodu --
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(...)
    -- Wpisz kod tutaj
end
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Logika i przepływ programu

Poćwicz samodzielnie: Kompilator Lua online