Liaison avec __index
Fait partie de la section Programmation orientée objet du Journey Lua de Coddy. Leçon 7 sur 70.
Vous avez une table prototype avec des propriétés et des méthodes, mais comment faire pour qu’un nouvel objet l’utilise réellement ? La réponse se trouve dans la méthode métaméthode __index.
Lorsque vous accédez à une clé qui n'existe pas dans une table, Lua renvoie normalement nil. Cependant, si la table possède une métatable avec un champ __index, Lua cherchera plutôt à cet endroit. En définissant __index pour qu'il pointe vers votre prototype, les clés manquantes sont automatiquement recherchées dans le prototype :
local Dog = {
species = "Canis familiaris",
legs = 4
}
function Dog:bark()
print("Woof!")
end
-- Créer une instance vide
local myDog = {}
-- La lier au prototype
setmetatable(myDog, { __index = Dog })
print(myDog.species) -- Sortie : Canis familiaris
myDog:bark() -- Sortie : Woof!La table myDog est complètement vide, pourtant l'accès à myDog.species fonctionne. Lorsque Lua ne trouve pas species dans myDog, il vérifie le __index de la métatable et le trouve dans Dog.
C’est le fondement de la programmation orientée objet en Lua. L’instance peut avoir ses propres données uniques, tandis que le comportement partagé réside dans le prototype. Dans la prochaine leçon, tu apprendras à encapsuler ce modèle dans une fonction constructeur claire.
Défi
FacileMettons maintenant la méthode metamethod __index en pratique ! Tu vas créer un prototype et y relier une instance, ce qui permettra à l’instance d’accéder à des propriétés et méthodes qu’elle ne possède pas directement.
Tu vas organiser ton code sur deux fichiers :
Robot.lua: définis une table prototypeRobotavec :- un champ
modeldéfini sur"RX-100" - un champ
batteryLeveldéfini sur100 - une méthode
:status()qui affiche l’état actuel du robot
- un champ
main.lua: importe le module Robot, puis crée une table d’instance vide et la relie au prototype Robot à l’aide desetmetatableavec__index. Cela permet à ton instance vide d’accéder à tout ce qui se trouve dans le prototype.
Tu recevras une entrée : un nom à attribuer à ton instance de robot.
Après avoir relié l’instance au prototype :
- attribue le nom reçu au champ
namede ton instance (il devient propre à l’instance) - appelle la méthode
:status()sur ton instance
Ta méthode :status() doit afficher exactement au format suivant :
[name] ([model]) - Battery: [batteryLevel]%Par exemple, si l’entrée est Sparky, la sortie doit être :
Sparky (RX-100) - Battery: 100%Remarque que l’instance possède son propre name, mais qu’elle accède à model et batteryLevel depuis le prototype grâce au lien __index.
Essayez vous-même
-- Lire l'entrée
local name = io.read()
-- Charger le module Robot
local Robot = require('Robot')
-- TODO: Créer une table d'instance vide
-- TODO: Lier l'instance au prototype Robot en utilisant setmetatable avec __index
-- TODO: Assigner le nom saisi au champ name de votre instance
-- TODO: Appeler la méthode :status() sur votre instance
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation orientée objet
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 RectangleClasse CercleMéthode PérimètreCollection de formesAire totaleFiltrer les formes2Modè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 formesEntraînez-vous par vous-même : Compilateur Lua en ligne