Explizites 'self'
Teil des Abschnitts Object Oriented Programming der Lua-Journey von Coddy — Lektion 2 von 70.
Wenn eine Funktion innerhalb einer Tabelle lebt, muss sie oft auf Daten innerhalb derselben Tabelle zugreifen oder diese ändern. Aber hier liegt das Problem: Woher weiß die Funktion, zu welcher Tabelle sie gehört?
Die Lösung besteht darin, die Tabelle explizit als erstes Argument an die Funktion zu übergeben. Konventionsgemäß wird dieser Parameter self genannt:
local counter = {
value = 0
}
function counter.increment(self)
self.value = self.value + 1
end
counter.increment(counter)
print(counter.value) -- Ausgabe: 1Beachten Sie, wie wir counter.increment(counter) aufrufen und dabei die Tabelle selbst als Argument übergeben. Innerhalb der Funktion bezieht sich self nun auf diese Tabelle, was es uns ermöglicht, self.value zu lesen und zu ändern.
Dieses Muster ist essenziell, da es der Funktion ermöglicht, mit den Daten der Tabelle zu arbeiten, ohne den Namen der Tabelle fest zu kodieren. Betrachten Sie eine Funktion, die den aktuellen Zählerstand zurücksetzt und zurückgibt:
function counter.reset(self)
local old = self.value
self.value = 0
return old
end
print(counter.reset(counter)) -- Ausgabe: 1
print(counter.value) -- Ausgabe: 0Während das manuelle Übergeben der Tabelle funktioniert, kann es sich repetitiv anfühlen. In der nächsten Lektion wirst du eine sauberere Syntax kennenlernen, die dies automatisch erledigt.
Aufgabe
EinfachErstellen Sie eine Tabelle namens tracker mit einem Feld count, das mit 0 initialisiert ist.
Fügen Sie eine Funktion tracker.addAmount(self, amount) hinzu, die:
self(die Tabelle) als ersten Parameter akzeptiertamountals zweiten Parameter akzeptiertamountzuself.countaddiert
Sie erhalten zwei Eingaben:
- Erster zu addierender Betrag
- Zweiter zu addierender Betrag
Rufen Sie tracker.addAmount zweimal auf (einmal für jede Eingabe) und übergeben Sie dabei jedes Mal die Tabelle als erstes Argument. Geben Sie nach beiden Aufrufen den Endwert von tracker.count aus.
Spickzettel
Funktionen innerhalb von Tabellen können auf Tabellendaten zugreifen, indem sie die Tabelle als ihren ersten Parameter erhalten, der konventionell self genannt wird:
local counter = {
value = 0
}
function counter.increment(self)
self.value = self.value + 1
end
counter.increment(counter) -- Übergibt die Tabelle als Argument
print(counter.value) -- Ausgabe: 1Der Parameter self ermöglicht es der Funktion, die Felder der Tabelle zu lesen und zu ändern, ohne den Tabellennamen fest zu kodieren:
function counter.reset(self)
local old = self.value
self.value = 0
return old
end
print(counter.reset(counter)) -- Ausgabe: 1
print(counter.value) -- Ausgabe: 0Funktionen können zusätzliche Parameter nach self akzeptieren:
function counter.add(self, amount)
self.value = self.value + amount
end
counter.add(counter, 5)Probier es selbst
-- Eingabe lesen
local amount1 = tonumber(io.read())
local amount2 = tonumber(io.read())
-- TODO: Schreibe deinen Code unten
-- Erstelle eine Tabelle namens 'tracker' mit einem Feld 'count', das mit 0 initialisiert ist
-- Füge eine Funktion tracker.addAmount(self, amount) hinzu, die amount zu self.count addiert
-- Rufe tracker.addAmount zweimal mit der Tabelle als erstem Argument auf
-- Gib den endgültigen Zählerstand aus
print(tracker.count)Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Object Oriented Programming
1Das 'self'-Konzept
Tabellen mit FunktionenExplizites 'self'Die Doppelpunkt-SyntaxPunkt vs. DoppelpunktZusammenfassung – Beweglicher Punkt4Projekt: Digitale Bank
Projekt-SetupEinzahlungsmethode7Polymorphie & Überschreiben
Methoden überschreibenElternmethoden aufrufenDuck TypingGemeinsames InterfaceTyp prüfenRückblick - Mitarbeiterrollen10Projekt: Formen-Manager
Projekt-SetupRechteck-Klasse2Klassen-Prototyp-Muster
Das Prototyp-KonzeptVerknüpfung mit __indexDer :new()-KonstruktorAttribute initialisierenUnabhängige InstanzenZusammenfassung – Autofabrik5Operatorüberladung in OOP
Objekte addierenObjekte subtrahierenObjekte verkettenObjekte vergleichen (<, >)Rückblick – Wallet-Mathematik3Objektzustand und -verhalten
InstanzvariablenGetter-MethodenSetter-MethodenBerechnete EigenschaftenStrings formatierenGleichheitsprüfungenZusammenfassung – Studentennote6Grundlagen der Vererbung
Das Vererbungs-SetupMethoden vererbenDen Konstruktor erweiternChild-Methoden hinzufügenGemeinsam vs. EinzigartigZusammenfassung - Formen-Hierarchie9Komposition & Mixins
Has-A-BeziehungDelegationEinfache MixinsAnwendung mehrerer MixinsMixins vs. VererbungZusammenfassung – Roboter-Montage12Abschluss-Herausforderungen
Wiederholung - InventarsystemWiederholung - BenutzerverwaltungWiederholung - Score-TrackerFinaler OOP-Check