La metamé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 accepte 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 (santé, mana, force).
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 de valeurs par défaut - Attachez la métatable à la table de personnage à l’aide de
setmetatable() - Renvoyez la table de personnage
Paramètres :
name(chaîne) : Le nom du personnagelevel(nombre) : Le niveau du personnage
Renvoie : Une table de personnage avec le nom, le niveau 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() contre ipairs()Récapitulatif - Fiche de personnage2Fonctions supplémentaires de la bibliothèque table
table.concat()construction de tables et unpack()table.sort()Tri personnalisé avec des fonctionsRécapitulatif - Tableau des meilleurs scores3Concepts avancés des fonctions
Retourner plusieurs valeursFonctions variadiques (...)Les fonctions comme valeurs de première classeFonctions anonymesQu’est-ce qu’une fermeture ?Récapitulatif - Gestionnaire d’événements simpleEntraînez-vous par vous-même : Compilateur Lua en ligne