Funkcje anonimowe
Część sekcji Logika i przepływ programu ścieżki Lua w Coddy. Lekcja 13 z 54.
Skoro już rozumiesz, że funkcje można przechowywać w zmiennych i przekazywać dalej, istnieje jeszcze bardziej zwięzły sposób ich zapisywania. Zamiast zawsze nadawać funkcji nazwę, możesz utworzyć ją bezpośrednio tam, gdzie jej potrzebujesz. Nazywa się je funkcjami anonimowymi.
Funkcja anonimowa to po prostu funkcja bez nazwy. Definiujesz ją za pomocą słowa kluczowego function, po którym bezpośrednio podajesz jej parametry i ciało:
function(a, b)
return a + b
endTworzy to wartość funkcji, której można od razu użyć. Funkcje anonimowe są szczególnie przydatne, gdy przekazujesz funkcje jako argumenty do innych funkcji. Pamiętasz przykład niestandardowego sortowania z wcześniejszej części? Oto jak wygląda z funkcją anonimową:
local players = {
{name = "Alice", score = 150},
{name = "Bob", score = 200},
{name = "Charlie", score = 175}
}
table.sort(players, function(a, b)
return a.score > b.score
end)Zamiast definiować osobną funkcję o nazwie służącą do porównywania, funkcja jest tworzona bezpośrednio jako drugi argument funkcji table.sort(). Dzięki temu kod jest bardziej zwarty, a logika sortowania znajduje się dokładnie tam, gdzie jest używana.
Wyzwanie
ŁatwyNapisz funkcję filterByThreshold, która przyjmuje numbers i threshold, a następnie zwraca nową tablicę zawierającą tylko liczby większe od progu.
Edytor zawiera już funkcję pomocniczą filter(list, keep): wywołuje keep(value) dla każdej wartości i zwraca nową tablicę z wartościami, dla których keep zwróciło true. Wywołaj filter i przekaż warunek jako funkcję anonimową zapisaną bezpośrednio w wywołaniu, tak jak w lekcji przekazywana jest funkcja do table.sort(). Nie zapisuj warunku w zmiennej ani nie nadawaj mu nazwy.
Parametry:
numbers(tablica): Tablica w formie listy zawierająca wartości liczbowethreshold(liczba): Minimalna wartość (wyłączna) używana do filtrowania
Zwraca: Tablicę zawierającą tylko liczby większe od progu (tablica)
Spróbuj swoich sił
local function filter(list, keep)
local result = {}
for _, value in ipairs(list) do
if keep(value) then
table.insert(result, value)
end
end
return result
end
function filterByThreshold(numbers, threshold)
-- Wpisz tutaj kod
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