Nulla è più importante di quello che è racchiuso nelle parentesi graffe. Se dovessi scegliere una frase per descrivere Lua sceglierei proprio questa. Volevo parlarvi di come utilizzare il paradigma a oggetti con Lua ma, rileggendo vari appunti, mi sono accorto che non posso assolutamente tralasciare una parte vitale del linguaggio: le tabelle.
Se in Lisp il tipo di dato base del linguaggio è la lista, se in Python è l’oggetto in Lua è la tabella. Non esiste nessun’altra struttura dati in Lua all’infuori della tabella: niente array, niente vettori, niente liste, solo ed esclusivamente tabelle.
Una tabella vuota si crea in un modo semplice:
Una nota tecnica. Le tabelle in Lua sono anonime ovvero tab
non contiene la tabella ma un riferimento ad essa. Infatti se faccio:
tab2 = tab1
tab2[2] = 2
print(tab1[2])
Otterrete come risultato 2. Le due variabili infatti si riferiscono alla stessa tabella!
Il modo più semplice per usare una tabella Lua è di usarla come un classico array.
tab[1] = 3
print(tab[2])
Nulla di difficile. Dovete fare occhio a due cose:
- Il primo elemento di una tabella ha indice 1 (invece di 0 come nel 99% dei linguaggi di programmazione. Non esiste quindi nessun
tab[0]
- Non esistono limiti quindi se chiamate
tab[-3]
otab[3090]
non otterrete nessunissimo errore. Semplicemente queste locazioni contengono il valore vuoto di Lua: nil
Non avete idea di quanti problemi possa causare la numerazione che parte da uno.
Per scorrere tutti i valori di un array definito in questo modo possiamo usare
print(item)
end
Il comando ipairs
restituisce indice e valore di ogni elemento di una tabella fino al primo “nil”.
Le tabelle Lua però, come potete immaginare, vanno ben oltre il semplice uso come array. Prendiamo questo codice d’esempio:
x = 9
tab[9] = "index is 9"
tab["x"] = "index is x"
tab["slashcode"] = "index is slashcode (great site!)"
print(tab[x])
print(tab["x"])
print(tab.x)
print(tab["9"])
Prima cosa, le tabelle possono essere indicizzate da qualunque tipo di dato e, in particolare, da stringhe. Questo permette una grande versatilità alle tabelle Lua che diventano, a tutti gli effetti, un dizionario. È possibile cioè usare chiavi generiche per memorizzare gli elementi in una tabella.
Secondo, provate a indovinare l’output dei quattro print.
- Il primo print restituisce
"index is 9"
. Abbiamo scelto di prendere il valore nella posizione indicata dalla variabile x che è uguale a 9. - Il secondo print restituisce
"index is x"
. Abbiamo scelto infatti di prendere il valore indicizzato dalla stringa “x” (e non dalla variabile x). - Il terzo print restituisce lo stesso valore del secondo. Questa è infatti una notazione alternativa che permette di richiamare i valori nella tabella indicizzati da stringhe. Potete, ad esempio, chiamare anche
tab.slashcode
- Il quarto print restituisce nil. Stiamo cercando di accedere alla locazione della tabella indicizzata dalla stringa “9” ma non abbiamo inizializzato nessuna locazione con quell’indice!
Come potete vedere le tabelle in Lua sono una struttura dati estremamente efficiente e versatile ma bisogna fare attenzione a non confondersi con gli indici (specie a non confondere indicizzazioni tramite stringhe o tramite variabili).
Le tabelle sono, inoltre, lo strumento principale per implementare il nostro meccanismo ObjectOriented in Lua. Ma questo lo vedremo la prossima volta.
PS: Nulla è più importante di quello che è racchiuso nelle parentesi graffe. In questo caso, nella foto, c’è la mia ragazza ed è veramente la cosa più importante. 🙂
Grazie!!!
Di nulla amore mio <3
archivio i tuoi articoli su lua in attesa di tempi migliori (def: migliori = maggiore tempo libero) mi sorprende però leggere che solo adesso parli delle tabelle…io di lua non so nulla..so solo che “lua sta alle tabelle come python sta alle liste” 😀
Ne parlo solo adesso perché sono partito dall’integrazione di Lua in C++, poi man mano che vedevo crescere l’interesse ho deciso di fare alcuni articoli dedicati a Lua (almeno per gli aspetti peculiari che lo distinguono dagli altri linguaggi).