Menu
Coddy logo textTech

Punkt vs. Doppelpunkt

Teil des Abschnitts Objektorientierte Programmierung der Lua-Journey von Coddy — Lektion 4 von 70.

Da Sie nun sowohl die Punkt- als auch die Doppelpunkt-Syntax kennen, ist es entscheidend zu verstehen, wann man welche verwendet – und was passiert, wenn man sie falsch kombiniert.

Die Grundregel ist einfach: wie Sie eine Funktion definieren, muss damit übereinstimmen, wie Sie sie aufrufen. Wenn Sie sie mit einem Doppelpunkt definieren, rufen Sie sie mit einem Doppelpunkt auf. Wenn Sie sie mit einem Punkt und explizitem self definieren, rufen Sie sie mit einem Punkt auf und übergeben Sie die Tabelle.

Hier ist, was passiert, wenn man sie falsch kombiniert:

local game = { score = 0 }

function game:addPoints(points)
    self.score = self.score + points
end

-- FALSCH: Aufruf mit Punkt, aber es wurde keine Tabelle übergeben
game.addPoints(10)  -- Fehler! self ist jetzt 10, nicht die Tabelle

Wenn man game.addPoints(10) aufruft, übergibt Lua game nicht automatisch. Der Wert 10 wird zu self, was zu unerwartetem Verhalten oder Fehlern führt.

Die umgekehrte Richtung ist nachsichtiger:

function game.reset(self)
    self.score = 0
end

-- Aufruf mit Doppelpunkt: game:reset() ist dasselbe wie game.reset(game)
game:reset()  -- self erhält korrekterweise game, daher funktioniert dies

Obwohl dieser spezielle Fall funktionieren mag, stiftet er Verwirrung und kann Funktionen beeinträchtigen, die bestimmte Argumente erwarten. Der sicherste Ansatz ist es, konsistent zu bleiben: Verwenden Sie den Doppelpunkt sowohl für die Definition als auch für den Aufruf, wenn die Funktion self benötigt, und verwenden Sie den Punkt, wenn dies nicht der Fall ist.

challenge icon

Aufgabe

Einfach

Erstellen Sie eine Tabelle namens player mit einem Feld score, das mit 0 initialisiert ist.

Fügen Sie der Tabelle zwei Funktionen hinzu:

  1. player.setScore(self, value) - definiert mit der Punkt-Syntax und einem expliziten self-Parameter. Setzt self.score auf den angegebenen Wert.
  2. player:addBonus(amount) - definiert mit der Doppelpunkt-Syntax. Addiert amount zu self.score.

Sie erhalten zwei Eingaben:

  1. Einen initialen Punktwert
  2. Einen Bonusbetrag, der hinzugefügt werden soll

Führen Sie die folgenden Schritte aus:

  1. Rufen Sie setScore unter Verwendung der Punkt-Syntax auf (wobei die Tabelle als erstes Argument übergeben wird), um den initialen Punktestand zu setzen
  2. Rufen Sie addBonus unter Verwendung der Doppelpunkt-Syntax auf, um den Bonus hinzuzufügen
  3. Geben Sie den Endwert von player.score aus

Denken Sie daran: Passen Sie den Aufruf jeder Funktion an die Art und Weise an, wie sie definiert wurde.

Probier es selbst

-- Eingabe lesen
local initialScore = tonumber(io.read())
local bonusAmount = tonumber(io.read())

-- TODO: Schreibe deinen Code unten
-- 1. Erstelle eine Tabelle namens 'player' mit einem Feld 'score', das mit 0 initialisiert ist
-- 2. Füge player.setScore(self, value) unter Verwendung der Punkt-Syntax mit explizitem self hinzu
-- 3. Füge player:addBonus(amount) unter Verwendung der Doppelpunkt-Syntax hinzu
-- 4. Rufe setScore unter Verwendung der Punkt-Syntax auf (übergib die Tabelle als erstes Argument)
-- 5. Rufe addBonus unter Verwendung der Doppelpunkt-Syntax auf


-- Gib den Endstand aus
print(player.score)
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 Objektorientierte Programmierung