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 : 100Dans 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 : 0Une table fournit des valeurs de remplacement fixes ; une fonction peut calculer une valeur pour toute clé absente.
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) etlevel(le niveau fourni) - Crée une métatable avec
__indexpointant 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 personnagelevel(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
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
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