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 TabelleWenn 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 diesAuch 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.
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 (wobei du die Tabelle als erstes Argument übergibst), um den anfänglichen Punktestand festzulegen - Rufe
addBonusmit Doppelpunktsyntax auf, um den Bonus hinzuzufügen - Gib den endgültigen Wert von
player.scoreaus
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)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