Lua elemento tabella (MetaTable)
In tabella Lua, siamo in grado di accedere al corrispondente valore chiave per ottenere il valore, ma non può essere utilizzato su due tavoli.
Pertanto, Lua offre un elemento di tabella (MetaTable), tavolo ci permettono di modificare il comportamento di ciascuna azione associata con il metodo degli elementi corrispondente.
Ad esempio, utilizzando la tabella meta, possiamo definire come tabella Lua per calcolare la somma delle due operazioni a + b.
Quando Lua tentativo l'aggiunta di due tavole, in primo luogo verificare se ci sono uno dei due tavoli di yuan, dopo aver verificato se c'è un luogo chiamato "__add" campo, se trovato, quindi chiamare il valore corrispondente. "__add" E l'altro campo istante, il valore corrispondente (spesso una funzione o una tabella) è il "metodo degli elementi."
Ci sono due funzioni molto importanti per gestire tavolo yuan:
- SetMetaTable (tavolo, metatabella): apparecchiare la tavola per l'elemento tabella specificata (metatabella), se ci __metatable tavolo elemento chiave (metatabella) in, SetMetaTable fallire.
- getmetatable (tabella): restituisce la tabella oggetto metadati (metatabella).
L'esempio seguente mostra come impostare la tabella per l'elemento tabella specificata:
mytable = {} -- 普通表 mymetatable = {} -- 元表 setmetatable(mytable,mymetatable) -- 把 mymetatable 设为 mytable 的元表
Il codice precedente può essere scritto direttamente alla linea:
mytable = setmetatable({},{})
Di seguito sono riportati nella tabella ritorno oggetto metadati:
getmetatable(mytable) -- 这回返回mymetatable
__index Element Method
Questa è la chiave metatabella più comunemente usato.
Quando si passa la chiave per accedere alla tabella, e se la chiave non ha alcun valore, quindi Lua si trova il tavolo di metatabella (supponendo metatabella) in chiave __index. Se __index contiene una tabella, Lua troverà il tasto corrispondente nella tabella.Siamo in grado di utilizzare il comando lua per entrare in modalità interattive Visualizzazioni:
$ 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
Se __index contiene una funzione, allora, Lua chiamerà quella funzione, tavolo e chiavi verrà passato come parametro alla funzione.
metodo degli elementi __index per visualizzare l'elemento tabella esiste, se non, restituire il risultato è pari a zero, se esiste da __index risultati di ritorno.
mytable = setmetatable({key1 = "value1"}, { __index = function(mytable, key) if key == "key2" then return "metatablevalue" else return nil end end }) print(mytable.key1,mytable.key2)
Esempi di output è:
value1 metatablevalue
Esempi di analisi:
tabella MyTable assegnato{chiave1 = "valore1"}.
MyTable set meta tavolo metodo degli elementi __index.
Trova key1 nella tabella MyTable, se trovato, restituire tale elemento non può essere trovato, continuare.
Trova key2 nella tabella MyTable, se trovato, metatablevalue ritorno, trovare continuato.
Analizzando meta tavolo non ha un metodo __index, se __index metodo è una funzione, chiamata la funzione.
- metodo degli elementi per verificare se in entrata "key2" chiave di parametri (set mytable.key2), se l'ingresso "Key2" parametro restituisce "metatablevalue", altrimenti mytable tasto corrispondente.
Siamo in grado di scrivere il codice di cui sopra è semplice:
mytable = setmetatable({key1 = "value1"}, { __index = { key2 = "metatablevalue" } }) print(mytable.key1,mytable.key2)
sommario
Lua ricerca governa un elemento tavolo quando, in realtà, le seguenti tre fasi:
- 1. Trovare nella tabella, se trovato, tornare quell'elemento, non trovato, continuare
- 2. determinare se la tabella ha tabella di RMB, se non vi è alcuna tabella dollaro tavolo elemento, di ritorno pari a zero, non vi è continuato.
- 3. Analizzare meta tabella non ha un metodo __index, se __index metodo è nullo, nullo ritorno, se __index metodo è una tabella, ripetere 1,2,3; se __index metodo è una funzione, la funzione restituisce valore di ritorno.
__newindex Element Method
metodo degli elementi __newindex viene utilizzato per aggiornare la tabella, __ indice è utilizzato per accedere alla tabella.
Quando si dà un incarico tabella indice mancante, l'interprete sarà __newindex Element Method: Se si chiama questa funzione senza assegnazione.
L'esempio seguente mostra l'applicazione __newindex Element Method:
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)
Esempi di attuazione dell'uscita sopra è:
value1 nil 新值2 新值1 nil
Esempi di tabelle di cui sopra indicati metodo degli elementi __newindex, quando la nuova assegnazione dei tasti di indice (newkey) (mytable.newkey = "nuovo valore 2"), chiamerà metodo degli elementi senza assegnazione. E se una chiave di indice esistente (key1), effettuerà l'assegnazione, senza chiamare Element Method __newindex.
L'esempio seguente utilizza la funzione rawset per aggiornare la tabella:
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)
Esempi di attuazione dell'uscita sopra è:
new value "4"
Aggiungere operatore per il tavolo
L'esempio seguente mostra due tabelle aggiungono funzionamento:
-- 计算表中最大值,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
Esempi di attuazione dell'uscita sopra è:
1 1 2 2 3 3 4 4 5 5 6 6
__add elemento chiave contenuti nella tabella, e aggiungere il funzionamento. Un elenco di azioni corrispondenti alla seguente tabella:
modo | descrizione |
---|---|
__add | operatore corrispondente '+'. |
__sub | operatore corrispondente '-'. |
__mul | operatore corrispondente '*'. |
__div | operatore corrispondente '/'. |
__mod | operatore corrispondente '%'. |
__unm | operatore corrispondente '-'. |
__concat | operatore corrispondente '..'. |
__eq | operatore corrispondente '=='. |
__lt | operatore corrispondente '<'. |
__le | operatore corrispondente '<='. |
__call Element Method
metodo degli elementi __call viene chiamato quando Lua chiama un valore. Il seguente esempio illustra la tabella di calcolo degli elementi, e:
-- 计算表中最大值,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))
Esempi di attuazione dell'uscita sopra è:
70
__toString Element Method
metodo degli elementi __toString viene utilizzato per modificare il comportamento della tabella di output. I seguenti esempi della nostra tabella di output personalizzati dei contenuti:
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)
Esempi di attuazione dell'uscita sopra è:
表所有元素的和为 60
Da questo articolo possiamo sapere Tabella può essere una buona semplificare la nostra funzione di codice, in modo da capire Lua meta tavolo ci permette di scrivere più semplice eccellente codice Lua.