Menu
Coddy logo textTech

« self » explicite

Fait partie de la section Object Oriented Programming du Journey Lua de Coddy — leçon 2 sur 70.

Lorsqu'une fonction réside à l'intérieur d'une table, elle a souvent besoin d'accéder à des données ou de les modifier au sein de cette même table. Mais voici le problème : comment la fonction sait-elle à quelle table elle appartient ?

La solution consiste à passer explicitement la table comme premier argument à la fonction. Par convention, ce paramètre est nommé self :

local counter = {
    value = 0
}

function counter.increment(self)
    self.value = self.value + 1
end

counter.increment(counter)
print(counter.value)  -- Résultat : 1

Remarquez comment nous appelons counter.increment(counter), en passant la table elle-même comme argument. À l'intérieur de la fonction, self fait maintenant référence à cette table, nous permettant de lire et de modifier self.value.

Ce modèle est essentiel car il permet à la fonction de travailler avec les données de la table sans coder en dur le nom de la table. Considérez une fonction qui réinitialise et renvoie le compte actuel :

function counter.reset(self)
    local old = self.value
    self.value = 0
    return old
end

print(counter.reset(counter))  -- Sortie : 1
print(counter.value)           -- Sortie : 0

Bien que le passage manuel de la table fonctionne, cela peut sembler répétitif. Dans la prochaine leçon, vous apprendrez une syntaxe plus propre qui gère cela automatiquement.

challenge icon

Défi

Facile

Créez une table nommée tracker avec un champ count initialisé à 0.

Ajoutez une fonction tracker.addAmount(self, amount) qui :

  • Accepte self (la table) comme premier paramètre
  • Accepte amount comme second paramètre
  • Ajoute amount à self.count

Vous recevrez deux entrées :

  1. Premier montant à ajouter
  2. Deuxième montant à ajouter

Appelez tracker.addAmount deux fois (une fois pour chaque entrée), en passant la table comme premier argument à chaque fois. Après les deux appels, affichez la valeur finale de tracker.count.

Aide-mémoire

Les fonctions à l'intérieur des tables peuvent accéder aux données de la table en recevant la table comme premier paramètre, conventionnellement nommé self :

local counter = {
    value = 0
}

function counter.increment(self)
    self.value = self.value + 1
end

counter.increment(counter)  -- Passe la table comme argument
print(counter.value)  -- Output: 1

Le paramètre self permet à la fonction de lire et de modifier les champs de la table sans coder en dur le nom de la table :

function counter.reset(self)
    local old = self.value
    self.value = 0
    return old
end

print(counter.reset(counter))  -- Output: 1
print(counter.value)           -- Output: 0

Les fonctions peuvent accepter des paramètres supplémentaires après self :

function counter.add(self, amount)
    self.value = self.value + amount
end

counter.add(counter, 5)

Essayez vous-même

-- Lire l'entrée
local amount1 = tonumber(io.read())
local amount2 = tonumber(io.read())

-- TODO: Écrivez votre code ci-dessous
-- Créer une table nommée 'tracker' avec un champ 'count' initialisé à 0
-- Ajouter une fonction tracker.addAmount(self, amount) qui ajoute amount à self.count
-- Appeler tracker.addAmount deux fois avec la table comme premier argument


-- Afficher le compte final
print(tracker.count)
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Object Oriented Programming