Punkt vs. Doppelpunkt
Teil des Abschnitts Objektorientierte Programmierung der Lua-Journey von Coddy — Lektion 4 von 70.
Da Sie nun sowohl die Punkt- als auch die Doppelpunkt-Syntax kennen, ist es entscheidend zu verstehen, wann man welche verwendet – 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 sie mit einem Doppelpunkt definieren, rufen Sie sie mit einem Doppelpunkt auf. Wenn Sie sie mit einem Punkt und explizitem self definieren, rufen Sie sie mit einem Punkt auf und übergeben Sie die Tabelle.
Hier ist, was passiert, wenn man sie falsch kombiniert:
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 man game.addPoints(10) aufruft, übergibt Lua game nicht automatisch. 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 korrekterweise game, daher funktioniert diesObwohl 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 der Punkt-Syntax und einem explizitenself-Parameter. Setztself.scoreauf den angegebenen Wert.player:addBonus(amount)- definiert mit der Doppelpunkt-Syntax. Addiertamountzuself.score.
Sie erhalten zwei Eingaben:
- Einen initialen Punktwert
- Einen Bonusbetrag, der hinzugefügt werden soll
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 zu setzen - 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 und Weise an, wie sie definiert wurde.
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 unter Verwendung der Punkt-Syntax auf (übergib die Tabelle als erstes Argument)
-- 5. Rufe addBonus unter Verwendung 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 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