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
endWewną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: 15Wyraż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: 4Wyzwanie
ŁatwyNapisz 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
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