Menu
Coddy logo textTech

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: 100

In 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.

challenge icon

Aufgabe

Einfach

Schreiben 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) und level (das angegebene Level)
  • Erstellen Sie eine Metatabelle, bei der __index auf 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 Charakters
  • level (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: 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.

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 Logic & Flow