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 TabelleWenn 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 erwartetObwohl 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.
Aufgabe
EinfachErstellen Sie eine Tabelle namens player mit einem Feld score, das mit 0 initialisiert ist.
Fügen Sie der Tabelle zwei Funktionen hinzu:
player.setScore(self, value)- definiert mit Punkt-Syntax und explizitemself-Parameter. Setztself.scoreauf den angegebenen Wert.player:addBonus(amount)- definiert mit Doppelpunkt-Syntax. Addiertamountzuself.score.
Sie erhalten zwei Eingaben:
- Einen initialen Punktwert
- Einen Bonusbetrag zum Hinzufügen
Führen Sie die folgenden Schritte aus:
- Rufen Sie
setScoreunter Verwendung der Punkt-Syntax auf (wobei die Tabelle als erstes Argument übergeben wird), um den initialen Punktestand festzulegen - Rufen Sie
addBonusunter Verwendung der Doppelpunkt-Syntax auf, um den Bonus hinzuzufügen - Geben Sie den Endwert von
player.scoreaus
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 explizitemselfdefinieren, 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 TabelleFalsche 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 verursachenKorrekte 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)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
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-Klasse2Klassen-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