La métaméthode __index
Fait partie de la section Logique et flux 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) -- Résultat : Alice
print(player.health) -- Résultat : 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 y regarde et trouve health = 100.
Cela crée un mécanisme de repli où une table peut fournir des valeurs par défaut pour une autre. La table originale 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 retourne 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() - Retournez la table de personnage
Paramètres :
name(string) : Le nom du personnagelevel(number) : Le niveau du personnage
Retourne : Une table de personnage avec name, level, et les statistiques par défaut accessibles via la métatable (table)
Essayez vous-même
function createCharacterWithDefaults(name, level)
-- Écrire 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 Logique et flux
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