Menu
Coddy logo textTech

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.

challenge icon

Défi

Facile

Mettons 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 prototype Robot avec :
    • un champ model défini sur "RX-100"
    • un champ batteryLevel défini sur 100
    • une méthode :status() qui affiche l’état actuel du robot
    Retourne la table à la fin du fichier.
  • main.lua : importe le module Robot, puis crée une table d’instance vide et la relie au prototype Robot à l’aide de setmetatable avec __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 :

  1. attribue le nom reçu au champ name de ton instance (il devient propre à l’instance)
  2. 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
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 Programmation orientée objet

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