Latest web development tutorials

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.