Menu
CoddyTech

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 Doppelpunktsyntax kennst, erfährst du hier, wie sie zusammenhängen und was schiefgeht, wenn die Tabelle nicht übergeben wird.

Beide Doppelpunkte sind Kurzschreibweisen. function game:addPoints(points) zu definieren ist dasselbe wie function game.addPoints(self, points) zu definieren, und game:addPoints(10) aufzurufen ist dasselbe wie game.addPoints(game, 10) aufzurufen. Eine Methode funktioniert, solange die Tabelle als erstes Argument übergeben wird.

Das passiert, wenn die Tabelle nicht übergeben wird:

local game = { score = 0 }

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

-- FALSCH: Aufruf mit Punkt, aber ohne Übergabe einer Tabelle
game.addPoints(10)  -- Fehler! self ist jetzt 10, nicht die Tabelle

Wenn du game.addPoints(10) aufrufst, übergibt Lua game nicht automatisch. Der Wert 10 wird zu self, und self.score schlägt fehl, weil 10 eine Zahl und keine Tabelle ist.

Eine mit einem Punkt definierte Funktion mit einem expliziten self funktioniert mit einem Aufruf per Doppelpunkt, weil der Doppelpunkt die Tabelle als erstes Argument übergibt:

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 das

Beide Definitionen erstellen dieselbe Funktion, daher ist die Wahl eine Konvention: Verwende den Doppelpunkt, um Funktionen zu definieren und aufzurufen, die mit self arbeiten, und den Punkt für Funktionen, die self nicht verwenden. Dann zeigt jeder Aufruf, ob die Tabelle übergeben wird.

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 (und übergib die Tabelle als erstes Argument), um den anfänglichen Punktestand festzulegen.
  2. Rufe addBonus mit Doppelpunktsyntax auf, um den Bonus zu addieren.
  3. Gib den endgültigen Wert von player.score aus.

Denk daran: Die Aufrufart jeder Funktion muss der Art entsprechen, mit der sie definiert wurde.

Probier es selbst

-- Eingabe einlesen
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 wird
-- 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 (übergib die Tabelle als erstes Argument)
-- 5. Rufe addBonus mit Doppelpunktsyntax auf


-- Den endgültigen Punktestand ausgeben
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