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 liczb, trzech lub dziesięciu, bez pisania osobnych funkcji dla każdego przypadku. Lua udostępnia specjalną składnię: trzy kropki ...
Gdy umieścisz ... na liście parametrów funkcji, staje się ona funkcją wariadyczną, która przyjmuje dowolną liczbę argumentów:
function sum(...)
-- Ciało funkcji
endWewnątrz funkcji możesz uzyskać dostęp do tych argumentów, ponownie używając .... Aby łatwiej z nimi pracować, możesz umieścić je w 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: 15Wyrażenie {...} tworzy tabelę w formie listy zawierającą wszystkie argumenty przekazane do funkcji. Następnie możesz iterować po tej tabeli tak jak po każdej innej, używając operatora długości # lub ipairs().
Wyzwanie
ŁatwyNapisz funkcję calculateAverage, która przyjmuje dowolną liczbę argumentów numerycznych i zwraca ich średnią.
Użyj składni wariadycznej ..., aby przyjąć zmienną liczbę argumentów, spakować je do tablicy, obliczyć ich sumę i podzielić ją przez ich liczbę.
Uwaga: Kod początkowy (oznaczony tekstem "Don't touch this code") odczytuje liczby z wejścia, konwertuje każdą z tekstu na liczbę za pomocą tonumber() i zapisuje je w tablicy o nazwie numbers. Na końcu wywołuje Twoją funkcję za pomocą unpack(numbers), co przekazuje wartości z tablicy jako osobne argumenty, więc Twoja funkcja otrzymuje je jako .... Nie musisz modyfikować tego kodu ani szczegółowo go rozumieć; skup się tylko na napisaniu funkcji calculateAverage.
Logika:
- Spakuj wszystkie argumenty do tablicy za pomocą
{...} - Przejdź przez tablicę, 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 (liczbę)
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(...)
-- Napisz tutaj kod
end
local average = calculateAverage(unpack(numbers))
print("Average: " .. average)
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
1Zaawansowane iterowanie po tabelach
Iterowanie za pomocą pairs()Iterowanie za pomocą ipairs()pairs() a ipairs()Powtórka — karta postaci2Więcej funkcji biblioteki table
table.concat()Tworzenie tabel i unpack()table.sort()Sortowanie niestandardowe za pomocą funkcjiPodsumowanie — tablica najlepszych wyników5Projekt: silnik tekstowej gry przygodowej
Konfiguracja projektu: pokójŁączenie pokoi3Zaawansowane koncepcje funkcji
Zwracanie wielu wartościFunkcje wariadyczne (...)Funkcje jako wartości pierwszej klasyFunkcje anonimoweCzym jest domknięcie?Podsumowanie — prosty obsługiwacz zdarzeńPoćwicz samodzielnie: Kompilator Lua online