English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

table (tabella) Lua

La tabella è un tipo di struttura dati di Lua usata per aiutarci a creare diversi tipi di dati, come: array, dizionario, ecc.

La tabella Lua utilizza array associativi, puoi usare qualsiasi tipo di valore come indice dell'array, ma questo valore non può essere nil.

La tabella Lua non ha una dimensione fissa, puoi espanderla in base alle tue esigenze.

Lua risolve anche moduli (module), pacchetti (package) e oggetti (Object) attraverso la tabella. Ad esempio, string.format indica l'uso di "format" per indicizzare la tabella string.

costruzione della tabella (tab)

L'espressione costruttiva è usata per creare e inizializzare la tabella. La tabella è una funzionalità potente specifica di Lua. Il costruttore più semplice è {}, usato per creare una tabella vuota. Puoi inizializzare direttamente un array:

-- inizializzazione della tabella
mytable = {}
-- valore specificato
mytable[1] = "Lua"
-- rimozione di riferimenti
mytable = nil
-- la raccolta dei rifiuti Lua rilascia la memoria

Quando assegniamo elementi alla tabella a e poi assegniamo a a b, a e b puntano alla stessa memoria. Se a viene impostato su nil se b può accedere agli elementi della tabella, se non c'è alcuna variabile che punta a a, il meccanismo di raccolta dei rifiuti di Lua pulirà la memoria corrispondente.

Esempi seguenti illustrano la situazione descritta sopra:

-- tabella semplice
mytable = {}
print("Il tipo della tabella mytable è ", type(mytable))
mytable[1] = "Lua"
mytable["wow"] = "prima della modifica"
print("l'elemento con l'indice 1 della tabella mytable è ", mytable[1])
print("L'elemento con l'indice wow di mytable è ", mytable["wow"])
-- alternatetable e mytable si riferiscono alla stessa tabella
alternatetable = mytable
print("L'elemento con l'indice 1 di alternatetable è ", alternatetable[1])
print("L'elemento con l'indice wow di mytable è ", alternatetable["wow"])
alternatetable["wow"] = "modificato"
print("L'elemento con l'indice wow di mytable è ", mytable["wow"])
-- Liberare la variabile
alternatetable = nil
print("alternatetable è ", alternatetable)
-- mytable può ancora essere acceduto
print("L'elemento con l'indice wow di mytable è ", mytable["wow"])
mytable = nil
print("mytable è ", mytable)

Il risultato dell'esecuzione del codice sopra è:

Il tipo di mytable è table
L'elemento con l'indice 1 di mytable è Lua
L'elemento con l'indice wow di mytable è nil, prima della modifica
L'elemento con l'indice 1 di alternatetable è Lua
L'elemento con l'indice wow di mytable è nil, prima della modifica
L'elemento con l'indice wow di mytable è nil, dopo la modifica
alternatetable è nil
L'elemento con l'indice wow di mytable è nil, dopo la modifica
mytable è nil

Operazioni sulla tabella

Di seguito è elencato i metodi comuni utilizzati per le operazioni sulla tabella:

Numero di sequenzaMetodo & Utilizzo
1table.concat (table [, sep [, start [, end]]]):

Concat è l'abbreviazione di concatenate (catenare, connettere). La funzione table.concat() elenca tutti gli elementi della parte array della tabella specificata tra le posizioni start e end, separati dal carattere di separazione (sep) specificato.

2table.insert (table, [pos,] value):

Inserire un elemento con valore value nella posizione (pos) della parte array della tabella. Il parametro pos è opzionale; per default viene inserito alla fine della parte array.

3table.maxn (table)

Specificare il valore chiave più grande tra tutte le chiavi positive della tabella. Se non esiste un elemento con valore chiave positivo, restituisce 0. (Dopo Lua5.2, questo metodo non esiste più; questo documento utilizza una funzione personalizzata per implementarlo)

4table.remove (table [, pos])

返回table数组部分位于pos位置的元素. 其后的元素会被前移. pos参数可选, 默认为table长度, 即从最后一个元素删起。

5table.sort (table [, comp])

对给定的table进行升序排序。

接下来我们来看下这几个方法的示例。

Table 连接

我们可以使用 concat() 输出一个列表中元素连接成的字符串:

fruits = {"banana","orange","apple"}
-- 返回 table 连接后的字符串
print("连接后的字符串 ",table.concat(fruits))
-- 指定连接字符
print("连接后的字符串 ",table.concat(fruits,","))
-- 指定索引来连接 table
print("连接后的字符串 ",table.concat(fruits,",",2,3))

Esegui il codice sopra per ottenere il seguente risultato:

连接后的字符串 bananaorangeapple
连接后的字符串 banana, orange, apple
连接后的字符串 orange, apple

插入和移除

以下示例演示了 table 的插入和移除操作:

fruits = {"banana","orange","apple"}
-- 在末尾插入
table.insert(fruits,"mango")
print("索引为 4 的元素为 ",fruits[4])
-- 在索引为 2 的键处插入
table.insert(fruits,2,"grapes")
print("索引为 2 的元素为 ",fruits[2])
print("最后一个元素为 ",fruits[5])
table.remove(fruits)
print("移除后最后一个元素为 ",fruits[5])

Esegui il codice sopra per ottenere il seguente risultato:

索引为 4 的元素为 mango
索引为 2 的元素为 grapes
最后一个元素为 mango
移除后最后一个元素为 nil

Table 排序

以下示例演示了 sort() 方法的使用,用于对 Table 进行排序:

fruits = {"banana","orange","apple","grapes"}
print("排序前")
per k, v in ipairs(fruits) fare
        print(k,v)
fine
table.sort(fruits)
print("ordinato")
per k, v in ipairs(fruits) fare
        print(k,v)
fine

Esegui il codice sopra per ottenere il seguente risultato:

prima dell'ordinamento
1    banana
2    arancia
3    mela
4    uva
ordinato
1    mela
2    banana
3    uva
4    arancia

Valore massimo table

table.maxn non esiste più dopo Lua5.2, abbiamo definito il metodo table_maxn per implementarlo.

Esempio seguente dimostra come ottenere il valore massimo in una table:

funzione table_maxn(t)
  locale mn=nil;
  per k, v in pairs(t) fare
    se(mn==nil) allora
      mn=v
    fine
    se mn < v allora
      mn = v
    fine
  fine
  ritorna mn
fine
tbl = {[1] = 2, [2] = 6, [3] = 34, [26] = 5}
print("valore massimo tbl:", table_maxn(tbl))
print("lunghezza tbl", #tbl)

Esegui il codice sopra per ottenere il seguente risultato:

valore massimo tbl:    34
lunghezza tbl     3

Attenzione:

quando otteniamo la lunghezza di una table, sia con # che con table.getn, entrambi si fermeranno all'indice di interruzione e non potranno ottenere correttamente la lunghezza della table.

puoi utilizzare i seguenti metodi per sostituirli:

funzione table_leng(t)
  locale leng=0
  per k, v in pairs(t) fare
    leng=leng+1
  fine
  ritorna leng;
fine