segue dalla terza parte

“Moonlight Bay” (ovvero: “chiedi chi erano i vectors”)

L’unica struttura dati disponibile in Lua è rappresentata dagli array o meglio, dalle tabelle (o hash): array associativi formati da coppie chiave-valore, nelle quali sia la chiave sia il valore possono essere qualsiasi tipo di dato. Vediamo un paio di esempi, dapprima un normale vettore:

> i = 3
> a = {1,3,5,7,9}
> print(i,a[3],a[4],a[i+3])

questa sequenza stampa i valori 3,5,7,nil; la prima cosa che appare diversa rispetto ad un altro linguaggio è che gli indici per gli array partono da 1 anziché da zero; la seconda è che un eventuale sforamento dell’array non causa errore ma semplicemente ritorna nil. Le tabelle Lua sono flessibili… Esploriamole con un esempio di complessità crescente.

>band={ Paul='basso', Ringo='batteria', George='chitarra', John='chitarra'}
>print(band['Ringo'])
batteria

ma anche, con una sintassi semplificata:

>print(band.Ringo)
batteria

E ovviamente funziona anche in modifica:

>band.Paul='chitarra'

È semplice aggiungere nuovi elementi (anche se gli effetti non sono sempre positivi!):

>band.Yoko='sitar'

se volessimo vedere il contenuto di tutta la tabella, non basterebbe un semplice print band, ma occorrerà iterare sui singoli elementi:

>for k,v in pairs(band) do print(k,v) end

I fans saranno felici di sapere che basta impostare un elemento a nil per rimuoverlo dalla tabella:

>band.Yoko=nil

Come dicevamo, un hash può contenere qualsiasi tipo di dato, comprese altre tabelle:

>band.tour={Londra,Parigi,Madrid,Roma}
>for city in 1,4 do print(band.tour[city]) end

e via complicando:

>band.playlist={
>>{titolo=Love me do,voto=8.5},
>>{titolo=Let it be, voto=8},
>>yday={titolo=Yesterday,voto=7.5},
>>help={titolo=Help,voto=7.5} 
>>}

possiamo accedere ai singoli elementi delle sotto-tabelle con la sintassi

>print(band['tour'][1])

o più semplicemente

>print(band.tour[1])

e in maniera analoga, avendo assegnato delle reference agli elementi, richiamarli per nome:

>print(band.playlist.help.voto)

Anticipo che quando gli elementi di una tabella sono funzioni, otteniamo un comportamento object-oriented:

>function suona(song)
>>print(Stiamo suonando,song)
>>end
>band.playfunc=suona