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 TabelleWenn 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 dasBeide 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.
Aufgabe
EinfachErstelle eine Tabelle namens player mit einem Feld score, das mit 0 initialisiert wird.
Füge der Tabelle zwei Funktionen hinzu:
player.setScore(self, value)– definiert mit Punktsyntax und dem expliziten Parameterself. Setztself.scoreauf den angegebenen Wert.player:addBonus(amount)– definiert mit Doppelpunktsyntax. Addiertamountzuself.score.
Du erhältst zwei Eingaben:
- Einen anfänglichen Punktestand
- Einen hinzuzufügenden Bonusbetrag
Führe die folgenden Schritte aus:
- Rufe
setScoremit Punktsyntax auf (und übergib die Tabelle als erstes Argument), um den anfänglichen Punktestand festzulegen. - Rufe
addBonusmit Doppelpunktsyntax auf, um den Bonus zu addieren. - Gib den endgültigen Wert von
player.scoreaus.
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)Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Das 'self'-Konzept
Tabellen mit FunktionenExplizites 'self'Die Doppelpunkt-SyntaxPunkt vs. DoppelpunktZusammenfassung – Beweglicher Punkt4Projekt: Digitale Bank
Projekt-SetupEinzahlungsmethode7Polymorphie & Überschreiben
Methoden überschreibenElternmethoden aufrufenDuck TypingGemeinsames InterfaceTyp prüfenRückblick - Mitarbeiterrollen10Projekt: Formen-Manager
Projekt-SetupRechteck-KlasseKreis-KlasseUmfang-MethodeFormen-SammlungGesamtflächeFormen filtern2Klassen-Prototyp-Muster
Das Prototyp-KonzeptVerknüpfung mit __indexDer :new()-KonstruktorAttribute initialisierenUnabhängige InstanzenZusammenfassung – Autofabrik5Operatorüberladung in OOP
Objekte addierenObjekte subtrahierenObjekte verkettenObjekte vergleichen (<, >)Rückblick – Wallet-Mathematik3Objektzustand und -verhalten
InstanzvariablenGetter-MethodenSetter-MethodenBerechnete EigenschaftenStrings formatierenGleichheitsprüfungenZusammenfassung – Studentennote6Grundlagen der Vererbung
Das Vererbungs-SetupMethoden vererbenDen Konstruktor erweiternChild-Methoden hinzufügenGemeinsam vs. EinzigartigZusammenfassung - Formen-Hierarchie9Komposition & Mixins
Has-A-BeziehungDelegationEinfache MixinsAnwendung mehrerer MixinsMixins vs. VererbungZusammenfassung – Roboter-Montage12Abschluss-Herausforderungen
Wiederholung - InventarsystemWiederholung - BenutzerverwaltungWiederholung - Score-TrackerFinaler OOP-CheckÜbe selbstständig: Online-Lua-Compiler