Menu
Coddy logo textTech

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: 3

Gdy 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.

challenge icon

Wyzwanie

Łatwy

Napisz 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 factor z funkcji zewnętrznej
  • Funkcja zagnieżdżona utworzy domknięcie, zapamiętując wartość factor
  • Wywołaj funkcję mnożącą z parametrem number i zwróć wynik

Parametry:

  • factor (liczba): wartość mnożnika
  • number (liczba): liczba do pomnożenia

Zwraca:

  • Wynik pomnożenia number przez factor (liczba)

Spróbuj swoich sił

function createMultiplier(factor, number)
    local multiply = function(x)
        return x * factor
    end
    
    -- Użyj funkcji multiply poniżej

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