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 : 100Dans 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.
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) etlevel(le niveau fourni) - Créez une métatable avec
__indexpointant 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 personnagelevel(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 : 100Cela 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
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
1Itération avancée des tables
Itérer avec pairs()Itérer avec ipairs()pairs() vs. ipairs()Récapitulatif - Fiche de personnage2Plus de fonctions de la bibliothèque table
table.concat()Construction de table & unpack()table.sort()Tri personnalisé avec des fonctionsRécapitulatif - Tableau des scores3Concepts avancés sur les fonctions
Retourner plusieurs valeursFonctions variadiques (...)Les fonctions comme valeurs de première classeFonctions anonymesQu'est-ce qu'une closure ?Récapitulatif - Gestionnaire d'événements simple