Was ist eine Closure?
Teil des Abschnitts Logic & Flow der Lua-Journey von Coddy — Lektion 14 von 54.
Sie haben gelernt, dass Funktionen in Variablen gespeichert, als Argumente übergeben und von anderen Funktionen zurückgegeben werden können. Jetzt werden wir eine der mächtigsten Konsequenzen daraus untersuchen: Closures.
Ein Closure entsteht, wenn eine verschachtelte Funktion die lokalen Variablen ihrer umschließenden Funktion „behält“, selbst nachdem die Ausführung dieser äußeren Funktion abgeschlossen ist. Das mag im ersten Moment seltsam klingen – wie kann eine Variable noch existieren, nachdem die Funktion, die sie erstellt hat, beendet ist?
Hier ist ein einfaches Beispiel, das dieses Konzept verdeutlicht:
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, erzeugt sie eine lokale Variable count und gibt eine anonyme Funktion zurück. Normalerweise würde man erwarten, dass count verschwindet, sobald createCounter() beendet ist. Aber die zurückgegebene Funktion hat immer noch Zugriff auf count – sie umschließt („closes over“) diese Variable.
Jedes Mal, wenn Sie counter() aufrufen, greift sie auf dieselbe count-Variable zu und modifiziert diese, die beim ersten Ausführen von createCounter() erstellt wurde. Die innere Funktion trägt ihre Umgebung mit sich und bewahrt so den Zustand zwischen den Aufrufen.
Aufgabe
EinfachSchreiben Sie eine Funktion createMultiplier, die eine Multiplikator-Funktion mit einem bestimmten Faktor erstellt und diese dann sofort verwendet, um eine gegebene Zahl zu multiplizieren.
Logik:
- Erstellen Sie eine verschachtelte Funktion innerhalb von
createMultiplier, die einen Zahlenparameter entgegennimmt - Die verschachtelte Funktion soll ihren Parameter mit dem
factoraus der äußeren Funktion multiplizieren - Die verschachtelte Funktion bildet eine Closure und merkt sich den Wert von
factor - Rufen Sie die Multiplikator-Funktion mit dem Parameter
numberauf und geben Sie das Ergebnis zurück
Parameter:
factor(Zahl): Der Multiplikator-Wertnumber(Zahl): Die zu multiplizierende Zahl
Rückgabewert:
- Das Ergebnis der Multiplikation von
numbermitfactor(Zahl)
Spickzettel
Eine Closure tritt auf, wenn eine verschachtelte Funktion sich an die lokalen Variablen ihrer umschließenden Funktion "erinnert", selbst nachdem die äußere Funktion ihre Ausführung beendet hat.
Die innere Funktion trägt ihre Umgebung mit sich und bewahrt den Zustand zwischen den Aufrufen:
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 sie eine lokale Variable count und gibt eine anonyme Funktion zurück. Die zurückgegebene Funktion hat weiterhin Zugriff auf count—sie "schließt" diese Variable ein, selbst nachdem die äußere Funktion die Ausführung beendet hat.
Probier es selbst
function createMultiplier(factor, number)
local multiply = function(x)
return x * factor
end
-- Verwende die Multiplikationsfunktion unten
endDiese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logic & Flow
1Fortgeschrittene Table-Iteration
Iterieren mit pairs()Iterieren mit ipairs()pairs() vs. ipairs()Zusammenfassung – Charakterbogen4Einführung in Metatables
Was ist eine Metatable?setmetatable & getmetatableDie __index-MetamethodeDie __newindex-MetamethodeDie __tostring-MetamethodeArithmetische Metamethoden Teil 1Arithmetische Metamethoden Teil 2Zusammenfassung – Schreibgeschützte Tabellen7Fortgeschrittene String-Manipulation
string.gsub() für ErsetzungenEinführung in String-Patternsstring.find()string.match()Iterieren mit string.gmatch()Rückblick – Log-File-Parser2Weitere Funktionen der Table-Bibliothek
table.concat()Tabellenerstellung & unpack()table.sort()Benutzerdefiniertes Sortieren mit FunktionenRückblick – Highscore-Tabelle3Fortgeschrittene Funktionskonzepte
Mehrere RückgabewerteVariadische Funktionen (...)Funktionen als First-Class ValuesAnonyme FunktionenWas ist eine Closure?Zusammenfassung – Einfacher Event Handler