Menu
Coddy logo textTech

Punkt vs. Doppelpunkt

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

Da du nun sowohl die Punkt- als auch die Doppelpunkt-Syntax kennst, ist es entscheidend zu verstehen, wann du welche verwenden solltest und was passiert, wenn du sie falsch kombinierst.

Die wichtigste Regel ist einfach: Die Art, wie du eine Funktion definierst, muss mit der Art übereinstimmen, wie du sie aufrufst. Wenn du sie mit einem Doppelpunkt definierst, rufe sie mit einem Doppelpunkt auf. Wenn du sie mit einem Punkt und explizitem self definierst, rufe sie mit einem Punkt auf und übergib die Tabelle.

So passiert es, wenn du sie falsch zuordnest:

local game = { score = 0 }

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

-- WRONG: Aufruf mit Punkt, aber keine Tabelle übergeben
game.addPoints(10)  -- Error! self ist jetzt 10, nicht die Tabelle

Wenn du game.addPoints(10) aufrufst, übergibt Lua nicht automatisch game. 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 korrekt game, daher funktioniert dies

Auch wenn dieser spezielle Fall funktionieren könnte, führt er zu Verwirrung und kann Funktionen beeinträchtigen, die bestimmte Argumente erwarten. Am sichersten ist es, konsequent zu bleiben: Verwende sowohl bei der Definition als auch beim Aufruf einen Doppelpunkt, wenn die Funktion self benötigt, und einen Punkt, wenn sie ihn nicht benötigt.

challenge icon

Aufgabe

Einfach

Erstelle eine Tabelle namens player mit einem Feld score, das mit 0 initialisiert wird.

Füge der Tabelle zwei Funktionen hinzu:

  1. player.setScore(self, value) – definiert mit Punktsyntax und dem expliziten Parameter self. Setzt self.score auf den angegebenen Wert.
  2. player:addBonus(amount) – definiert mit Doppelpunktsyntax. Addiert amount zu self.score.

Du erhältst zwei Eingaben:

  1. Einen anfänglichen Punktestand
  2. Einen hinzuzufügenden Bonusbetrag

Führe die folgenden Schritte aus:

  1. Rufe setScore mit Punktsyntax auf (wobei du die Tabelle als erstes Argument übergibst), um den anfänglichen Punktestand festzulegen
  2. Rufe addBonus mit Doppelpunktsyntax auf, um den Bonus hinzuzufügen
  3. Gib den endgültigen Wert von player.score aus

Denke daran: Die Art, wie du jede Funktion aufrufst, muss der Art entsprechen, wie sie definiert wurde.

Probier es selbst

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

-- TODO: Schreibe deinen Code darunter
-- 1. Erstelle eine Tabelle namens 'player' mit einem Feld 'score', initialisiert mit 0
-- 2. Füge player.setScore(self, value) mit Punktsyntax und explizitem self hinzu
-- 3. Füge player:addBonus(amount) mit Doppelpunktsyntax hinzu
-- 4. Rufe setScore mit Punktsyntax auf (Tabelle als erstes Argument übergeben)
-- 5. Rufe addBonus mit Doppelpunktsyntax auf


-- Gib den finalen Score 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

Übe selbstständig: Online-Lua-Compiler