Die __index-Metamethode
Teil des Abschnitts Logic & Flow der Lua-Journey von Coddy — Lektion 18 von 54.
Jetzt, da Sie wissen, wie man Metatabellen an Tabellen anhängt, ist es an der Zeit, die wichtigste Metamethode kennenzulernen: __index. Diese Metamethode steuert, was passiert, wenn Sie versuchen, auf einen Schlüssel zuzugreifen, der in einer Tabelle nicht existiert.
Normalerweise gibt Lua nil zurück, wenn Sie einen Schlüssel nachschlagen, der nicht in einer Tabelle enthalten ist. Wenn eine Tabelle jedoch eine Metatabelle mit einem __index-Feld hat, prüft Lua stattdessen dieses Feld. Wenn __index auf eine andere Tabelle verweist, sucht Lua dort nach dem Schlüssel:
local defaults = {
health = 100,
speed = 10
}
local player = {name = "Alice"}
local meta = {__index = defaults}
setmetatable(player, meta)
print(player.name) -- Ausgabe: Alice
print(player.health) -- Ausgabe: 100In diesem Beispiel hat player nur einen name-Schlüssel. Wenn Sie auf player.health zugreifen, findet Lua dies nicht in player, daher prüft es das __index-Feld der Metatabelle. Da __index auf die defaults-Tabelle verweist, schaut Lua dort nach und findet health = 100.
Dies erstellt einen Fallback-Mechanismus, bei dem eine Tabelle Standardwerte für eine andere bereitstellen kann. Die ursprüngliche Tabelle behält ihre eigenen Werte bei, aber alle fehlenden Schlüssel werden automatisch in der Fallback-Tabelle nachgeschlagen.
Aufgabe
EinfachSchreiben Sie eine Funktion createCharacterWithDefaults, die name und level entgegennimmt und eine Charakter-Tabelle mit Standard-Statistikwerten zurückgibt.
Erstellen Sie eine Charakter-Tabelle mit dem angegebenen Namen und Level. Verwenden Sie eine Metatabelle mit __index, um Standardwerte für fehlende Statistiken (health, mana, strength) bereitzustellen.
Logik:
- Erstellen Sie eine defaults-Tabelle mit den Schlüsseln:
health = 100,mana = 50,strength = 10 - Erstellen Sie eine Charakter-Tabelle mit den Schlüsseln:
name(der angegebene Name) undlevel(das angegebene Level) - Erstellen Sie eine Metatabelle, bei der
__indexauf die defaults-Tabelle zeigt - Verknüpfen Sie die Metatabelle mit der Charakter-Tabelle unter Verwendung von
setmetatable() - Geben Sie die Charakter-Tabelle zurück
Parameter:
name(string): Der Name des Charakterslevel(number): Das Level des Charakters
Rückgabewert: Eine Charakter-Tabelle mit name, level und Standard-Statistiken, die über die Metatabelle zugänglich sind (table)
Spickzettel
Die __index-Metamethode steuert, was passiert, wenn Sie versuchen, auf einen Schlüssel zuzugreifen, der in einer Tabelle nicht existiert.
Wenn eine Tabelle eine Metatabelle mit einem __index-Feld hat, das auf eine andere Tabelle verweist, sucht Lua in dieser Tabelle nach fehlenden Schlüsseln:
local defaults = {
health = 100,
speed = 10
}
local player = {name = "Alice"}
local meta = {__index = defaults}
setmetatable(player, meta)
print(player.name) -- Ausgabe: Alice
print(player.health) -- Ausgabe: 100Dies erzeugt einen Fallback-Mechanismus, bei dem eine Tabelle Standardwerte für eine andere bereitstellen kann. Die ursprüngliche Tabelle behält ihre eigenen Werte, aber alle fehlenden Schlüssel werden automatisch in der Fallback-Tabelle nachgeschlagen.
Probier es selbst
function createCharacterWithDefaults(name, level)
-- Schreibe hier den Code
end
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logic & Flow
1Fortgeschrittene Table-Iteration
Iterieren mit pairs()Iterieren mit ipairs()pairs() vs. ipairs()Zusammenfassung – Charakterbogen4Einführung in Metatables
Was ist eine Metatable?setmetatable & getmetatableDie __index-MetamethodeDie __newindex-MetamethodeDie __tostring-MetamethodeArithmetische Metamethoden Teil 1Arithmetische Metamethoden Teil 2Zusammenfassung – Schreibgeschützte Tabellen7Fortgeschrittene String-Manipulation
string.gsub() für ErsetzungenEinführung in String-Patternsstring.find()string.match()Iterieren mit string.gmatch()Rückblick – Log-File-Parser2Weitere Funktionen der Table-Bibliothek
table.concat()Tabellenerstellung & unpack()table.sort()Benutzerdefiniertes Sortieren mit FunktionenRückblick – Highscore-Tabelle