Menu
Coddy logo textTech

La métaméthode __index

Fait partie de la section Logic & Flow du Journey Lua de Coddy — leçon 18 sur 54.

Maintenant que vous savez comment attacher des métatables à des tables, il est temps d'en apprendre davantage sur la métaméthode la plus importante : __index. Cette métaméthode contrôle ce qui se passe lorsque vous essayez d'accéder à une clé qui n'existe pas dans une table.

Normalement, lorsque vous recherchez une clé qui ne se trouve pas dans une table, Lua renvoie nil. Mais lorsqu'une table possède une métatable avec un champ __index, Lua vérifiera ce champ à la place. Si __index pointe vers une autre table, Lua y cherchera la clé :

local defaults = {
    health = 100,
    speed = 10
}

local player = {name = "Alice"}
local meta = {__index = defaults}

setmetatable(player, meta)

print(player.name)    -- Sortie : Alice
print(player.health)  -- Sortie : 100

Dans cet exemple, player possède uniquement une clé name. Lorsque vous accédez à player.health, Lua ne le trouve pas dans player, il vérifie donc le champ __index de la métatable. Puisque __index pointe vers la table defaults, Lua regarde à cet endroit et trouve health = 100.

Cela crée un mécanisme de repli (fallback) où une table peut fournir des valeurs par défaut pour une autre. La table d'origine conserve ses propres valeurs, mais toutes les clés manquantes sont automatiquement recherchées dans la table de repli.

challenge icon

Défi

Facile

Écrivez une fonction createCharacterWithDefaults qui prend name et level et renvoie une table de personnage avec des valeurs de statistiques par défaut.

Créez une table de personnage avec le nom et le niveau fournis. Utilisez une métatable avec __index pour fournir des valeurs par défaut pour toutes les statistiques manquantes (health, mana, strength).

Logique :

  • Créez une table de valeurs par défaut avec les clés : health = 100, mana = 50, strength = 10
  • Créez une table de personnage avec les clés : name (le nom fourni) et level (le niveau fourni)
  • Créez une métatable avec __index pointant vers la table des valeurs par défaut
  • Attachez la métatable à la table de personnage en utilisant setmetatable()
  • Renvoyez la table de personnage

Paramètres :

  • name (string) : Le nom du personnage
  • level (number) : Le niveau du personnage

Retourne : Une table de personnage avec le nom, le niveau et les statistiques par défaut accessibles via la métatable (table)

Aide-mémoire

La métaméthode __index contrôle ce qui se passe lorsque vous tentez d'accéder à une clé qui n'existe pas dans une table.

Lorsqu'une table possède une métatable avec un champ __index pointant vers une autre table, Lua recherchera les clés manquantes dans cette table :

local defaults = {
    health = 100,
    speed = 10
}

local player = {name = "Alice"}
local meta = {__index = defaults}

setmetatable(player, meta)

print(player.name)    -- Résultat : Alice
print(player.health)  -- Résultat : 100

Cela crée un mécanisme de repli (fallback) où une table peut fournir des valeurs par défaut à une autre. La table d'origine conserve ses propres valeurs, mais toutes les clés manquantes sont automatiquement recherchées dans la table de repli.

Essayez vous-même

function createCharacterWithDefaults(name, level)
    -- Écrivez le code ici
end
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 Logic & Flow