Menu
CoddyTech

La metaméthode __index

Fait partie de la section Logique et déroulement du programme du Journey Lua de Coddy. Leçon 18 sur 54.

Maintenant que tu sais comment attacher des métatables aux tables, il est temps de découvrir le métaméthode le plus important : __index. Ce métaméthode contrôle ce qui se passe lorsque tu essaies d’accéder à une clé qui n’existe pas dans une table.

Normalement, lorsque tu recherches 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 plutôt ce champ. 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 ne possède qu’une clé name. Lorsque tu accèdes à player.health, Lua ne la trouve pas dans player, alors il vérifie le champ __index de la métatable. Comme __index pointe vers la table defaults, Lua y cherche et trouve health = 100.

Cela crée un mécanisme de repli 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.

__index peut aussi être une fonction. Lorsqu’une clé est absente, Lua l’appelle en lui transmettant la table et la clé, puis utilise la valeur qu’elle renvoie :

local scores = {alice = 12}

setmetatable(scores, {
    __index = function(t, key)
        return 0  -- chaque nom absent compte pour 0
    end
})

print(scores.alice)  -- Sortie : 12
print(scores.bob)    -- Sortie : 0

Une table fournit des valeurs de remplacement fixes ; une fonction peut calculer une valeur pour toute clé absente.

challenge icon

Défi

Facile

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

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

Logique :

  • Crée une table defaults avec les clés : health = 100, mana = 50, strength = 10
  • Crée une table de personnage avec les clés : name (le nom fourni) et level (le niveau fourni)
  • Crée une métatable avec __index pointant vers la table defaults
  • Attache la métatable à la table de personnage à l’aide de setmetatable()
  • Renvoie la table de personnage

Paramètres :

  • name (chaîne) : Le nom du personnage
  • level (nombre) : Le niveau du personnage

Renvoie : Une table de personnage avec un nom, un niveau et des statistiques par défaut accessibles via la métatable (table)

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 Logique et déroulement du programme

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