setmetatable & getmetatable
Teil des Abschnitts Logic & Flow 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 Metatable an eine Tabelle anzuhängen, verwenden Sie setmetatable(). Diese Funktion nimmt zwei Argumente entgegen: die Tabelle, die Sie ändern möchten (die Haupttabelle) und die Metatable, die Sie an sie anhängen möchten:
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
EinfachSchreiben Sie eine Funktion attachMetatable, die mainTable und metaTable entgegennimmt und true zurückgibt, wenn die Metatabelle erfolgreich zugewiesen wurde.
Verwenden Sie setmetatable(), um die Metatabelle der Haupttabelle zuzuweisen, und überprüfen Sie die Zuweisung anschließend mit getmetatable().
Logik:
- Weisen Sie
metaTabledermainTablemithilfe vonsetmetatable()zu - Rufen Sie die zugewiesene Metatabelle mit
getmetatable()ab - Vergleichen Sie die abgerufene Metatabelle mit der ursprünglichen
metaTable - Geben Sie
truezurück, wenn sie übereinstimmen, andernfallsfalse
Parameter:
mainTable(table): Die Tabelle, der die Metatabelle zugewiesen wirdmetaTable(table): Die zuzuweisende Metatabelle
Rückgabewert: true, wenn die Metatabelle erfolgreich zugewiesen und überprüft wurde, andernfalls false (boolean)
Spickzettel
Lua bietet zwei wesentliche Funktionen für die Arbeit mit Metatabellen:
setmetatable() - Verknüpft eine Metatabelle mit einer Tabelle. Erwartet zwei Argumente: die Haupttabelle und die zu verknüpfende Metatabelle. Gibt die Haupttabelle zurück.
local myTable = {name = "Alice"}
local myMetatable = {}
setmetatable(myTable, myMetatable)getmetatable() - Ruft die mit einer Tabelle verknüpfte Metatabelle ab. Gibt die Metatabelle zurück, falls eine verknüpft ist, oder nil, falls die Tabelle keine Metatabelle hat.
local retrievedMeta = getmetatable(myTable)
print(retrievedMeta == myMetatable) -- Ausgabe: trueProbier 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 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