Menu
Coddy logo textTech

Die __index-Metamethode

Teil des Abschnitts Logik & Programmablauf der Lua-Journey von Coddy. Lektion 18 von 54.

Nachdem Sie nun 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 man einen Schlüssel nachschlägt, der nicht in einer Tabelle vorhanden 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: 100

In diesem Beispiel hat player nur einen name-Schlüssel. Wenn Sie auf player.health zugreifen, findet Lua diesen 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 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.

challenge icon

Aufgabe

Einfach

Schreibe eine Funktion createCharacterWithDefaults, die name und level entgegennimmt und eine Charaktertabelle mit Standardwerten für die Attribute zurückgibt.

Erstelle eine Charaktertabelle mit dem angegebenen Namen und Level. Verwende eine Metatabelle mit __index, um Standardwerte für fehlende Attribute (Gesundheit, Mana, Stärke) bereitzustellen.

Logik:

  • Erstelle eine Standardwertetabelle mit den Schlüsseln: health = 100, mana = 50, strength = 10
  • Erstelle eine Charaktertabelle mit den Schlüsseln: name (der angegebene Name) und level (das angegebene Level)
  • Erstelle eine Metatabelle mit __index, das auf die Standardwertetabelle verweist
  • Verknüpfe die Metatabelle mithilfe von setmetatable() mit der Charaktertabelle
  • Gib die Charaktertabelle zurück

Parameter:

  • name (String): Der Name des Charakters
  • level (Zahl): Das Level des Charakters

Rückgabe: Eine Charaktertabelle mit Name, Level und über die Metatabelle zugänglichen Standardattributen (Tabelle)

Probier es selbst

function createCharacterWithDefaults(name, level)
    -- Schreibe hier den Code
end
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logik & Programmablauf

Übe selbstständig: Online-Lua-Compiler