Menu
CoddyTech

Self und Methoden mit Doppelpunkt

Teil des Abschnitts Einführung in Luau der Lua-Journey von Coddy. Lektion 45 von 80.

rect.area(rect) zu schreiben funktioniert, aber du hast bereits im Lua-OOP eine bessere Möglichkeit kennengelernt: den Doppelpunkt. rect:area() ist genau derselbe Aufruf: Lua übergibt automatisch die Tabelle vor dem Doppelpunkt als erstes Argument, self.

Der Doppelpunkt hilft auch bei der Definition. function account:deposit(amount) deklariert für dich einen verborgenen ersten Parameter namens self:

type Account = {
    owner: string,
    balance: number,
    deposit: (self: Account, amount: number) -> (),
    getBalance: (self: Account) -> number,
}

local account = {owner = "Maya", balance = 1500}

function account:deposit(amount: number)
    self.balance += amount -- self ist implizit
end

function account:getBalance(): number
    return self.balance
end

Beachte, dass die Form self explizit deklariert, deposit: (self: Account, amount: number) -> (), obwohl der Doppelpunkt es in der Implementierung verbirgt. Der Doppelpunkt ist syntaktischer Zucker; der Parameter ist weiterhin vorhanden und der Typ führt ihn ausdrücklich auf. Eine Methode, die nichts zurückgibt, wird mit der leeren Rückgabe -> () typisiert.

Beim Aufruf gilt dieselbe Regel, die du bereits kennst: account:deposit(250) ist identisch mit account.deposit(account, 250). Dasselbe Laufzeitverhalten wie in deinem OOP-Kapitel: Luau fügt lediglich Typen hinzu.

Beachte, dass account selbst keine Typannotation hat. Der Typ Account beschreibt die fertige Tabelle, und die Tabelle entspricht ihm erst, wenn beide Methoden hinzugefügt wurden; local account: Account = {owner = "Maya", balance = 1500} würde im strikten Modus wegen der fehlenden Methoden einen Fehler melden.

challenge icon

Aufgabe

Einfach

Füge einem Konto zwei Methoden mit der Doppelpunktsyntax hinzu.

  1. Definiere unter der Tabelle function account:deposit(amount: number), das amount zu self.balance addiert.
  2. Definiere function account:getBalance(): number, das self.balance zurückgibt.
  3. Gib account:getBalance() aus, rufe account:deposit(120) auf und gib anschließend erneut account:getBalance() aus.

Drücke auf Run Code: Die Ausgabe zeigt 300, dann 420.

Probier es selbst

type Account = {
    owner: string,
    balance: number,
    deposit: (self: Account, amount: number) -> (),
    getBalance: (self: Account) -> number,
}

local account = {owner = "Noah", balance = 300}

-- 1) function account:deposit(amount: number)
-- 2) function account:getBalance(): number
-- 3) Gib den Kontostand aus, zahle 120 ein und gib ihn erneut aus

Alle Lektionen in Einführung in Luau

Übe selbstständig: Online-Luau-Compiler