Menu
CoddyTech

Méthodes avec Self et deux-points

Fait partie de la section Introduction à Luau du Journey Lua de Coddy. Leçon 45 sur 80.

Écrire rect.area(rect) fonctionne, mais tu as appris une meilleure façon dans le chapitre sur la POO en Lua : les deux-points. rect:area() correspond exactement au même appel : Lua transmet automatiquement la table située avant les deux-points comme premier argument, self.

Les deux-points sont aussi utiles lors de la définition. function account:deposit(amount) déclare pour toi un premier paramètre caché nommé 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 est implicite
end

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

Remarque que la structure déclare self explicitement, deposit: (self: Account, amount: number) -> (), même si les deux-points le masquent dans l’implémentation. Les deux-points sont une simplification syntaxique ; le paramètre est toujours présent, et le type le précise. Une méthode qui ne renvoie rien est typée avec le retour vide -> ().

L’appel suit la même règle que tu connais déjà : account:deposit(250) est identique à account.deposit(account, 250). Le même comportement à l’exécution que dans ton chapitre sur la POO : Luau ajoute simplement des types par-dessus.

Remarque que account lui-même n’est pas annoté. Le type Account décrit la table complète, et la table ne lui correspond qu’une fois les deux méthodes ajoutées ; local account: Account = {owner = "Maya", balance = 1500} ferait signaler les méthodes manquantes en mode strict.

challenge icon

Défi

Facile

Associe deux méthodes à un compte avec la syntaxe à deux-points.

  1. Sous la table, définis function account:deposit(amount: number) qui ajoute amount à self.balance.
  2. Définis function account:getBalance(): number qui renvoie self.balance.
  3. Affiche account:getBalance(), appelle account:deposit(120), puis affiche de nouveau account:getBalance().

Appuie sur Exécuter le code : la sortie affiche 300, puis 420.

Essayez vous-même

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

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

-- 1) fonction account:deposit(amount: number)
-- 2) fonction account:getBalance(): number
-- 3) affiche le solde, dépose 120, puis affiche-le à nouveau

Toutes les leçons de Introduction à Luau

Entraînez-vous par vous-même : Compilateur Luau en ligne