Was ist eine Closure?
Teil des Abschnitts Logik & Programmablauf der Lua-Journey von Coddy. Lektion 14 von 54.
Du hast gelernt, dass Funktionen in Variablen gespeichert, als Argumente übergeben und von anderen Funktionen zurückgegeben werden können. Nun werden wir eine der mächtigsten Konsequenzen davon untersuchen: Closures.
Ein Closure entsteht, wenn eine verschachtelte Funktion sich an die lokalen Variablen ihrer einschließenden Funktion „erinnert“, selbst nachdem diese äußere Funktion ihre Ausführung beendet hat. Das mag zunächst seltsam klingen: Wie kann eine Variable noch existieren, nachdem die Funktion, die sie erstellt hat, abgeschlossen ist?
Hier ist ein einfaches Beispiel, das dieses Konzept veranschaulicht:
function createCounter()
local count = 0
return function()
count = count + 1
return count
end
end
local counter = createCounter()
print(counter()) -- Ausgabe: 1
print(counter()) -- Ausgabe: 2
print(counter()) -- Ausgabe: 3Wenn createCounter() aufgerufen wird, erstellt es eine lokale Variable count und gibt eine anonyme Funktion zurück. Normalerweise würdest du erwarten, dass count verschwindet, sobald createCounter() abgeschlossen ist. Aber die zurückgegebene Funktion hat weiterhin Zugriff auf count. Sie „schließt diese Variable ein“.
Jedes Mal, wenn du counter() aufrufst, greift es auf dieselbe Variable count zu und verändert sie, die beim ersten Ausführen von createCounter() erstellt wurde. Die innere Funktion führt ihre Umgebung mit sich und bewahrt den Zustand zwischen den Aufrufen.
Aufgabe
EinfachSchreibe eine Funktion createMultiplier, die eine Multiplikatorfunktion mit einem bestimmten Faktor erstellt und sie dann sofort verwendet, um eine angegebene Zahl zu multiplizieren.
Logik:
- Erstelle innerhalb von
createMultipliereine verschachtelte Funktion, die einen number-Parameter entgegennimmt - Die verschachtelte Funktion sollte ihren Parameter mit dem
factoraus der äußeren Funktion multiplizieren - Die verschachtelte Funktion bildet einen Closure und merkt sich den Wert von
factor - Rufe die Multiplikatorfunktion mit dem
number-Parameter auf und gib das Ergebnis zurück
Parameter:
factor(number): Der Multiplikatorwertnumber(number): Die zu multiplizierende Zahl
Rückgabewert:
- Das Ergebnis der Multiplikation von
numbermitfactor(number)
Probier es selbst
function createMultiplier(factor, number)
local multiply = function(x)
return x * factor
end
-- Verwende die multiply-Funktion unten
endDiese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Programmablauf
1Fortgeschrittene Tabelleniteration
Iterieren mit pairs()Iterieren mit ipairs()pairs() vs. ipairs()Zusammenfassung – Charakterbogen2Weitere Funktionen der Tabellenbibliothek
table.concat()Tabellenkonstruktion & unpack()table.sort()Eigene Sortierung mit FunktionenRückblick – Highscore-Tabelle3Fortgeschrittene Funktionskonzepte
Mehrere Werte zurückgebenVariadische Funktionen (...)Funktionen als Werte erster KlasseAnonyme FunktionenWas ist eine Closure?Rückblick – Einfacher Event-HandlerÜbe selbstständig: Online-Lua-Compiler