Menu
Coddy logo textTech

Punkt vs. Doppelpunkt

Teil des Abschnitts Object Oriented Programming der Lua-Journey von Coddy — Lektion 4 von 70.

Nachdem Sie nun sowohl die Punkt- als auch die Doppelpunkt-Syntax kennen, ist es entscheidend zu verstehen, wann welche zu verwenden ist – 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 mit einem Doppelpunkt definieren, rufen Sie mit einem Doppelpunkt auf. Wenn Sie mit einem Punkt und explizitem self definieren, rufen Sie mit einem Punkt auf und übergeben Sie die Tabelle.

Das passiert, wenn man sie falsch zuordnet:

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 Sie game.addPoints(10) aufrufen, übergibt Lua nicht automatisch game. Der Wert 10 wird zu self, was zu unerwartetem Verhalten oder Fehlern führt.

Auch der umgekehrte Fehler führt zu Problemen:

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

-- FALSCH: Der Aufruf mit Doppelpunkt übergibt game zweimal
game:reset()  -- self erhält game, aber ein zusätzliches nil-Argument wird ebenfalls erwartet

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 Punkt-Syntax und explizitem self-Parameter. Setzt self.score auf den angegebenen Wert.
  2. player:addBonus(amount) - definiert mit Doppelpunkt-Syntax. Addiert amount zu self.score.

Sie erhalten zwei Eingaben:

  1. Einen initialen Punktwert
  2. Einen Bonusbetrag zum Hinzufügen

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 festzulegen
  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 ihrer Definition an.

Spickzettel

Beim Definieren und Aufrufen von Methoden in Lua muss die Syntax übereinstimmen:

  • Wenn Sie mit einem Doppelpunkt (:) definieren, rufen Sie mit einem Doppelpunkt auf
  • Wenn Sie mit einem Punkt (.) und explizitem self definieren, rufen Sie mit einem Punkt auf und übergeben Sie die Tabelle

Falsche Verwendung - Aufruf mit Punkt, wenn mit Doppelpunkt definiert:

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

game.addPoints(10)  -- Fehler! self wird zu 10, nicht zur Tabelle

Falsche Verwendung - Aufruf mit Doppelpunkt, wenn mit Punkt definiert:

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

game:reset()  -- Verwirrend: übergibt game automatisch, kann aber Probleme verursachen

Korrekte Verwendung - übereinstimmende Syntax:

-- Mit Doppelpunkt definieren, mit Doppelpunkt aufrufen
function game:addPoints(points)
    self.score = self.score + points
end
game:addPoints(10)

-- Mit Punkt definieren, mit Punkt aufrufen
function game.reset(self)
    self.score = 0
end
game.reset(game)

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 mit der Punkt-Syntax auf (übergebe die Tabelle als erstes Argument)
-- 5. Rufe addBonus mit 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 Object Oriented Programming