« 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 : 1Remarquez 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 : 0Bien 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.
Défi
FacileCré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
amountcomme second paramètre - Ajoute
amountàself.count
Vous recevrez deux entrées :
- Premier montant à ajouter
- 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: 1Le 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: 0Les 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)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
1Le concept de « self »
Tables avec fonctions« self » expliciteLa syntaxe avec deux-pointsPoint vs deux-pointsRécapitulatif - Point mobile4Projet : Banque numérique
Configuration du projetMéthode de dépôt7Polymorphisme et Redéfinition
Redéfinition de méthodesAppeler des méthodes parentesDuck TypingInterface communeVérification du typeRécapitulatif - Rôles des employés10Projet : Gestionnaire de formes
Configuration du projetClasse Rectangle2Modèle de prototype de classe
Le concept de prototypeLiaison avec __indexLe constructeur :new()Initialisation des attributsInstances indépendantesRécapitulatif - Usine de voitures5Surcharge d'opérateurs en POO
Additionner des objetsSoustraire des objetsConcaténer des objetsComparer des objets (<, >)Récapitulatif - Calculs de portefeuille8Encapsulation
Conventions de nommageClosures pour la confidentialitéAccès via les ClosuresTables en lecture seuleLogique de validationRécapitulatif - Coffre-fort sécurisé11Patrons de conception (Lite)
Fonctions FactoryTable SingletonPatron IteratorObserver (Écouteur)Récapitulatif - Logger Factory3État et comportement des objets
Variables d'instanceMéthodes GetterMéthodes SetterPropriétés calculéesFormatage de chaînesVérifications d'égalitéRécapitulatif - Note de l'étudiant6Bases de l'héritage
Mise en place de l'héritageHériter des méthodesÉtendre le constructeurAjouter des méthodes enfantsPartagé vs UniqueRécapitulatif - Hiérarchie des formes