setmetatable & getmetatable
Teil des Abschnitts Logik & Programmablauf der Lua-Journey von Coddy. Lektion 17 von 54.
Nachdem Sie nun verstanden haben, was Metatabellen konzeptionell sind, ist es an der Zeit zu lernen, wie man tatsächlich mit ihnen arbeitet. Lua bietet hierfür zwei wesentliche Funktionen: setmetatable(), um einer Tabelle eine Metatabelle zuzuweisen, und getmetatable(), um diese abzurufen.
Um eine Metatabelle an eine Tabelle anzuhängen, verwendest du setmetatable(). Diese Funktion nimmt zwei Argumente entgegen: die Tabelle, die du ändern möchtest (die Haupttabelle), und die Metatabelle, die du daran anhängen möchtest:
local myTable = {name = "Alice"}
local myMetatable = {}
setmetatable(myTable, myMetatable)In diesem Beispiel ist myMetatable nun mit myTable verknüpft. Die Metatabelle selbst ist vorerst leer, aber dies stellt die Verbindung zwischen den beiden Tabellen her. Die setmetatable()-Funktion gibt auch die Haupttabelle zurück, was es Ihnen ermöglicht, die Operation bei Bedarf zu verketten.
Um die Metatabelle abzurufen, die mit einer Tabelle verknüpft ist, verwenden Sie getmetatable():
local retrievedMeta = getmetatable(myTable)
print(retrievedMeta == myMetatable) -- Ausgabe: trueDiese Funktion gibt die Metatabelle zurück, wenn eine angehängt ist, oder nil, wenn die Tabelle keine Metatabelle hat. Dies ist nützlich, wenn Sie die Metatabelle einer Tabelle prüfen oder ändern müssen, nachdem sie gesetzt wurde.
Das Verständnis dieser beiden Funktionen ist die Grundlage für die gesamte Arbeit mit Metatabellen in Lua. Sobald Sie Metatabellen anhängen und abrufen können, sind Sie bereit, Metamethoden zu definieren, die das Verhalten Ihrer Tabellen ändern.
Aufgabe
EinfachSchreibe eine Funktion attachMetatable, die mainTable und metaTable übernimmt und true zurückgibt, wenn die Metatabelle erfolgreich angehängt wurde.
Verwende setmetatable(), um die Metatabelle an die Haupttabelle anzuhängen, und überprüfe anschließend die Verknüpfung mit getmetatable().
Logik:
- Hänge
metaTablemithilfe vonsetmetatable()anmainTablean - Rufe die angehängte Metatabelle mithilfe von
getmetatable()ab - Vergleiche die abgerufene Metatabelle mit der ursprünglichen
metaTable - Gib
truezurück, wenn sie übereinstimmen, andernfallsfalse
Parameter:
mainTable(Tabelle): Die Tabelle, an die die Metatabelle angehängt wirdmetaTable(Tabelle): Die anzuhängende Metatabelle
Rückgabewert: true, wenn die Metatabelle erfolgreich angehängt und überprüft wurde, andernfalls false (boolesch)
Probier es selbst
function attachMetatable(mainTable, metaTable)
-- 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 Logik & Programmablauf
1Fortgeschrittene Tabelleniteration
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 2Rückblick – Read-Only-Tabelle2Weitere Funktionen der Tabellenbibliothek
table.concat()Tabellenkonstruktion & unpack()table.sort()Eigene Sortierung mit FunktionenRückblick – Highscore-TabelleÜbe selbstständig: Online-Lua-Compiler