Latest web development tutorials

Lua Tischelement (MetaTable)

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:

  • setmetatable (Tisch, Metatabelle): Setzt die Tabelle für den angegebenen Tabellenelement (Metatabelle), wenn es Schlüsselelement Tabelle __metatable (Metatabelle) in, setmetatable scheitern.
  • getmetatable (Tabelle): Gibt die Objekt - Metadaten - Tabelle (Metatabelle).

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

__index-Elemente-Methode

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.

  • Element-Methode, ob eingehende "key2" Parametertaste (mytable.key2 gesetzt), wenn die eingehenden "key2" Parameter gibt "metatablevalue", ansonsten Mytable entsprechenden Schlüssel zu überprüfen.

Wir können der obige Code ist einfach schreiben:

mytable = setmetatable({key1 = "value1"}, { __index = { key2 = "metatablevalue" } })
print(mytable.key1,mytable.key2)

Zusammenfassung

Lua-Lookup-Regeln ein Tabellenelement, wenn in der Tat, die drei wie folgt vorgehen:

  • 1. In der Tabelle finden, wenn sie gefunden, wird dieses Element zurückgeben, nicht gefunden wird, weiter
  • 2. festzustellen, ob die Tabelle RMB Tabelle hat, wenn kein Element Tabelle ist, Rückkehr Null, wird fortgesetzt Dollar Tisch.
  • 3. Meta-Tabelle Analyse hat keine __index Methode, wenn __index Methode null, null zurückgeben, wenn __index Methode eine Tabelle ist, wiederholen Sie 1,2,3, wenn __index Methode ist eine Funktion, die Funktion zurück Rückgabewert.

__newindex-Elemente-Methode

__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, "\""..value.."\"")

  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"

In Operator für den Tisch

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 '..'.
__eq Entsprechende Operator '=='.
__lt Entsprechende Operator '<'.
__le Entsprechende Operator '<='.

__call-Elemente-Methode

__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

__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 "表所有元素的和为 " .. 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.