Czym jest domknięcie?
Część sekcji Logika i przepływ programu ścieżki Lua w Coddy. Lekcja 14 z 54.
Wiesz już, że funkcje można przechowywać w zmiennych, przekazywać jako argumenty i zwracać z innych funkcji. Teraz omówimy jedną z najpotężniejszych konsekwencji tego zjawiska: domknięcia.
Domknięcie występuje, gdy funkcja zagnieżdżona „pamięta” zmienne lokalne z otaczającej ją funkcji, nawet po zakończeniu wykonywania tej zewnętrznej funkcji. Na początku może to brzmieć dziwnie: jak zmienna może nadal istnieć po zakończeniu działania funkcji, która ją utworzyła?
Oto prosty przykład, który demonstruje tę koncepcję:
function createCounter()
local count = 0
return function()
count = count + 1
return count
end
end
local counter = createCounter()
print(counter()) -- Wynik: 1
print(counter()) -- Wynik: 2
print(counter()) -- Wynik: 3Gdy wywoływana jest funkcja createCounter(), tworzy ona zmienną lokalną count i zwraca funkcję anonimową. Zwykle można by oczekiwać, że zmienna count zniknie po zakończeniu działania funkcji createCounter(). Jednak zwrócona funkcja nadal ma dostęp do zmiennej count. „Przechwytuje” tę zmienną.
Za każdym razem, gdy wywołujesz counter(), uzyskuje ona dostęp do tej samej zmiennej count, która została utworzona podczas pierwszego uruchomienia createCounter(), i ją modyfikuje. Funkcja wewnętrzna przenosi ze sobą swoje środowisko, zachowując stan między wywołaniami.
Wyzwanie
ŁatwyNapisz funkcję createMultiplier, która tworzy funkcję mnożącą z określonym współczynnikiem, a następnie od razu używa jej do pomnożenia podanej liczby.
Logika:
- Utwórz funkcję zagnieżdżoną wewnątrz
createMultiplier, która przyjmuje parametr będący liczbą - Funkcja zagnieżdżona powinna pomnożyć swój parametr przez
factorz funkcji zewnętrznej - Funkcja zagnieżdżona utworzy domknięcie, zapamiętując wartość
factor - Wywołaj funkcję mnożącą z parametrem
numberi zwróć wynik
Parametry:
factor(liczba): wartość mnożnikanumber(liczba): liczba do pomnożenia
Zwraca:
- Wynik pomnożenia
numberprzezfactor(liczba)
Spróbuj swoich sił
function createMultiplier(factor, number)
local multiply = function(x)
return x * factor
end
-- Użyj funkcji multiply poniżej
endTa 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