Menu
CoddyTech

Die __index-Metamethode

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

Da du nun weißt, wie man Metatabellen an Tabellen anhängt, ist es an der Zeit, die wichtigste Metamethode kennenzulernen: __index. Diese Metamethode bestimmt, was passiert, wenn du versuchst, auf einen Schlüssel zuzugreifen, der in einer Tabelle nicht existiert.

Normalerweise gibt Lua nil zurück, wenn du nach einem Schlüssel suchst, der nicht in einer Tabelle enthalten ist. Wenn eine Tabelle jedoch eine Metatabelle mit einem Feld __index 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 Schlüssel namens name. Wenn du auf player.health zugreifst, findet Lua diesen Schlüssel nicht in player und prüft daher das Feld __index der Metatabelle. Da __index auf die Tabelle defaults verweist, sucht Lua dort und findet health = 100.

Dadurch entsteht ein Fallback-Mechanismus, bei dem eine Tabelle Standardwerte für eine andere bereitstellen kann. Die ursprüngliche Tabelle behält ihre eigenen Werte, aber fehlende Schlüssel werden automatisch in der Fallback-Tabelle nachgeschlagen.

__index kann auch eine Funktion sein. Wenn ein Schlüssel fehlt, ruft Lua sie mit der Tabelle und dem Schlüssel auf und verwendet den Rückgabewert:

local scores = {alice = 12}

setmetatable(scores, {
    __index = function(t, key)
        return 0  -- Jeder fehlende Name zählt als 0
    end
})

print(scores.alice)  -- Ausgabe: 12
print(scores.bob)    -- Ausgabe: 0

Eine Tabelle liefert feste Ersatzwerte; eine Funktion kann für jeden fehlenden Schlüssel einen Wert ermitteln.

challenge icon

Aufgabe

Einfach

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

Erstelle eine Charaktertabelle mit dem angegebenen Namen und Level. Verwende eine Metatabelle mit __index, um Standardwerte für alle fehlenden Werte (health, mana, strength) bereitzustellen.

Logik:

  • Erstelle eine Tabelle mit Standardwerten und 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 Tabelle mit den Standardwerten verweist
  • Füge die Metatabelle mithilfe von setmetatable() an die Charaktertabelle an
  • Gib die Charaktertabelle zurück

Parameter:

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

Rückgabewert: Eine Charaktertabelle mit Name, Level und Standardwerten, die über die Metatabelle zugänglich sind (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 und Programmablauf

Übe selbstständig: Online-Lua-Compiler