segue dalla settima parte
Oggetti volanti e non
Lua non è un linguaggio nativamente object-oriented. Se nei nostri script volessimo adottare uno stile OOP, ad esempio per modellare le operazioni su un conto corrente la cosa più naturale sarebbe usare una tabella:
Conto = { saldo = 200.0 }
Questa sintassi potrebbe essere assimilata al ‘costruttore’ dell’oggetto Conto. Possiamo anche definire dei metodi:
function Conto.preleva(cifra)
Conto.saldo = Conto.saldo - cifra
end
e quindi potremmo comodamente chiamare, problemi economici a parte:
Conto.preleva(200)
purtroppo, però, questa implementazione semplicistica ha il difetto di essere legata alla variabile Conto; possiamo infatti invocare il metodo solo su quella:
a1=Conto; Conto=nil
a1.preleva(200.0) -- errore!
La soluzione consiste nell’aggiungere un ulteriore parametro al metodo, ovvero passare l’oggetto su cui operare, che in pratica è la prassi anche in altri linguaggi come Python:
function Conto.preleva(self,cifra)
self.saldo = self.saldo - cifra
end
ora dunque siamo liberi di dare qualsiasi nome al nostro oggetto:
a2=Conto; Conto=nil;
a2.preleva(a2,100.0) -- nessun errore
però siamo obbligati a passare sempre l’oggetto come primo parametro. Ci viene in aiuto la sintassi:
a2:preleva(100.0)
possiamo usare la stessa forma anche per definire le funzioni-metodo:
function Conto:deposita(cifra)
self.saldo = self.saldo + cifra
end
il parametro ’nascosto’ si chiamerà sempre self; altri linguaggi lo chiamano this ma il concetto non cambia. Sull’argomento object oriented ci sarebbe ancora molto da dire, ma invito gli interessati a consultare il capitolo 16 di “Programming in Lua”, il libro ufficiale del quale la prima edizione è disponibile gratuitamente all’URL http://www.lua.org/pil/16.html