Das beste Lua Tischelement (MetaTable)-Tutorial im Jahr 2024. In diesem Tutorial können Sie __index-Elemente-Methode,__newindex-Elemente-Methode,In Operator für den Tisch,__call-Elemente-Methode,__toString-Elemente-Methode, lernen
In Lua Tabelle können wir den entsprechenden Schlüsselwert zugreifen Wert zu erhalten, aber es kann nicht auf zwei Tisch betrieben werden.
Daher Lua ein Tabellenelement (MetaTable) sieht Tisch ermöglichen es uns, das Verhalten der einzelnen Maßnahmen mit dem entsprechenden Element Methode verbunden zu ändern.
Um beispielsweise die meta-Tabelle verwenden, können wir bestimmen, wie Lua Tabelle, die die Summe von zwei Operationen a + b zu berechnen.
Wenn Lua Versuch, zwei Tabellen hinzufügen, zunächst prüfen, ob es eine von zwei Yuan Tabelle sind, nach der Überprüfung, ob es einen Ort namens "__add" Feld, wenn gefunden, dann den entsprechenden Wert nennen. "__add" Und andere Instant-Feld, wird der entsprechende Wert (oft eine Funktion oder eine Tabelle) ist das "Element-Methode."
Es gibt zwei sehr wichtige Funktionen Yuan Tabelle zu handhaben:
Das folgende Beispiel zeigt, wie die Tabelle für den angegebenen Tabellenelement zu setzen:
mytable = {} -- 普通表 mymetatable = {} -- 元表 setmetatable(mytable,mymetatable) -- 把 mymetatable 设为 mytable 的元表
Der obige Code kann direkt in die Zeile geschrieben werden:
mytable = setmetatable({},{})
Im Folgenden sind die Rückgabeobjekt Metadatentabelle:
getmetatable(mytable) -- 这回返回mymetatable
Dies ist das am häufigsten verwendete MetaTable Schlüssel.
Wenn Sie den Schlüssel übergeben Sie die Tabelle zuzugreifen, und wenn der Schlüssel keinen Wert hat, dann die Tabelle der Metatabelle (unter der Annahme Metatabelle) in __index Schlüssel Lua finden. Wenn __index eine Tabelle enthält, Lua den entsprechenden Schlüssel in der Tabelle zu finden.Wir können lua Befehl eingeben interaktiven Modus Ansichten verwenden:
$ lua Lua 5.3.0 Copyright (C) 1994-2015 Lua.org, PUC-Rio > other = { foo = 3 } > t = setmetatable({}, { __index = other }) > t.foo 3 > t.bar nil
Wenn __index eine Funktion enthält, dann wird Lua nennen diese Funktion, Tisch und Schlüssel werden als Parameter an die Funktion übergeben werden.
__index-Elemente-Methode das Tabellenelement zu sehen ist vorhanden, wenn nicht, geben das Ergebnis ist gleich Null, wenn es durch __index Rückkehr Ergebnisse vorhanden.
mytable = setmetatable({key1 = "value1"}, { __index = function(mytable, key) if key == "key2" then return "metatablevalue" else return nil end end }) print(mytable.key1,mytable.key2)
Beispiele für Ausgabe ist:
value1 metatablevalue
Analyse Beispiele:
mytable Tabelle zugeordnet{key1 = "Wert1"}.
Mytable Set Meta Tisch-Element-Methode __index.
Finden key1 in der mytable Tabelle, wenn gefunden werden, gehen dieses Element nicht gefunden werden kann, fortgesetzt werden.
Finden Schlüssel2 in der mytable Tabelle, wenn gefunden werden, gehen metatablevalue finden fortgesetzt.
Meta-Tabelle Analyse hat keine __index Methode, wenn __index Methode eine Funktion ist, die Funktion aufrufen.
Wir können der obige Code ist einfach schreiben:
mytable = setmetatable({key1 = "value1"}, { __index = { key2 = "metatablevalue" } }) print(mytable.key1,mytable.key2)
Lua-Lookup-Regeln ein Tabellenelement, wenn in der Tat, die drei wie folgt vorgehen:
__newindex-Elemente-Methode verwendet wird, um die Tabelle zu aktualisieren, wird __ Index verwendet, um die Tabelle zuzugreifen.
Wenn Sie eine fehlende Indextabelle Zuordnung geben, wird der Interpreter aussehen __newindex-Elemente-Methode: Wenn Sie ohne Zuordnung diese Funktion aufrufen.
Das folgende Beispiel zeigt die Element-Methode __newindex Anwendung:
mymetatable = {} mytable = setmetatable({key1 = "value1"}, { __newindex = mymetatable }) print(mytable.key1) mytable.newkey = "新值2" print(mytable.newkey,mymetatable.newkey) mytable.key1 = "新值1" print(mytable.key1,mymetatable.key1)
Beispiele für die Durchführung der oben genannten Ausgabe ist:
value1 nil 新值2 新值1 nil
Beispiele für die obigen Tabellen-Elemente-Methode __newindex, wenn der neue Index-Taste (newkey) Zuordnung (mytable.newkey = "neuen Wert 2"), werden Elemente-Methode ohne Zuordnung aufrufen. Und wenn eine bestehende Indexschlüssel (key1), wird die Zuordnung durchführen, ohne __newindex-Elemente-Methode aufrufen.
Das folgende Beispiel verwendet rawset Funktion, um die Tabelle zu aktualisieren:
mytable = setmetatable({key1 = "value1"}, { __newindex = function(mytable, key, value) rawset(mytable, key, "\""devaluede"\"") end }) mytable.key1 = "new value" mytable.key2 = 4 print(mytable.key1,mytable.key2)
Beispiele für die Durchführung der oben genannten Ausgabe ist:
new value "4"
Das folgende Beispiel zeigt zwei Tabellen Betrieb hinzufügen:
-- 计算表中最大值,table.maxn在Lua5.2以上版本中已无法使用 -- 自定义计算表中最大值函数 table_maxn function table_maxn(t) local mn = 0 for k, v in pairs(t) do if mn < k then mn = k end end return mn end -- 两表相加操作 mytable = setmetatable({ 1, 2, 3 }, { __add = function(mytable, newtable) for i = 1, table_maxn(newtable) do table.insert(mytable, table_maxn(mytable)+1,newtable[i]) end return mytable end }) secondtable = {4,5,6} mytable = mytable + secondtable for k,v in ipairs(mytable) do print(k,v) end
Beispiele für die Durchführung der oben genannten Ausgabe ist:
1 1 2 2 3 3 4 4 5 5 6 6
__add Schlüsselelement in der Tabelle enthalten sind, und den Betrieb hinzufügen. Eine Liste von Aktionen in der folgenden Tabelle entsprechen:
Modus | Beschreibung |
---|---|
__add | Entsprechende Operator '+'. |
__sub | Entsprechende Operator "-". |
__mul | Entsprechende Operator '*'. |
__div | Entsprechende Operator '/'. |
__mod | Entsprechende Operator "%". |
__unm | Entsprechende Operator "-". |
__concat | Entsprechende Operator 'de'. |
__eq | Entsprechende Operator '=='. |
__lt | Entsprechende Operator '<'. |
__le | Entsprechende Operator '<='. |
__call-Elemente-Methode wird aufgerufen, wenn Lua Wert nennt. Das folgende Beispiel veranschaulicht die Berechnungstabelle der Elemente, und:
-- 计算表中最大值,table.maxn在Lua5.2以上版本中已无法使用 -- 自定义计算表中最大值函数 table_maxn function table_maxn(t) local mn = 0 for k, v in pairs(t) do if mn < k then mn = k end end return mn end -- 定义元方法__call mytable = setmetatable({10}, { __call = function(mytable, newtable) sum = 0 for i = 1, table_maxn(mytable) do sum = sum + mytable[i] end for i = 1, table_maxn(newtable) do sum = sum + newtable[i] end return sum end }) newtable = {10,20,30} print(mytable(newtable))
Beispiele für die Durchführung der oben genannten Ausgabe ist:
70
__toString-Elemente-Methode wird verwendet, um das Verhalten des Ausgabetabelle zu modifizieren. Die folgenden Beispiele unserer kundenspezifischen Ausgabe Inhaltsverzeichnis:
mytable = setmetatable({ 10, 20, 30 }, { __tostring = function(mytable) sum = 0 for k, v in pairs(mytable) do sum = sum + v end return "表所有元素的和为 " de sum end }) print(mytable)
Beispiele für die Durchführung der oben genannten Ausgabe ist:
表所有元素的和为 60
Von diesem Artikel können wir Element Tabelle kennen eine gute unseren Code-Funktion vereinfachen kann, so Meta-Tabelle Lua Verständnis ermöglicht es uns einfacher ausgezeichnete Lua Code zu schreiben.