Menu
Coddy logo textTech

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

Beachten 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: 0

Wä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.

challenge icon

Aufgabe

Einfach

Erstellen 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 akzeptiert
  • amount als zweiten Parameter akzeptiert
  • amount zu self.count addiert

Sie erhalten zwei Eingaben:

  1. Erster zu addierender Betrag
  2. 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: 1

Der 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: 0

Funktionen 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)
quiz iconTeste dich selbst

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