Creazione di oggetti (che sono semplicemente tabelle) è molto diversa con Lua. L'idea di base è creare una tabella regolare contenente attributi (funzioni e valori) comuni a tutte le istanze. Questa tabella, chiamerò CAT per Common Attributes Table.
Se si fa riferimento a un attributo in una tabella e Lua non riesce a trovare questo attributo, c'è un modo per dire Lua dove altro cercare l'attributo. Vogliamo che Lua guardi nel CAT per attributi comuni. Metatables risponde a questa necessità. Maggiori informazioni su come funziona dopo.
Abbiamo bisogno anche metodi nella CAT per poter utilizzare valori delle istanze. Self risposte che servono. Quando si chiama una funzione di tabella (metodo) in questo modo: tableName:methodName()
, Lua inserisce automaticamente un riferimento all'oggetto tabella come primo parametro. Il nome di questo parametro è self. Anche se il metodo si trova nel CAT, self si riferirà alla particolare tabella di istanza dell'oggetto chiamante.
supponga di avere un gatto di nome auto.
metaCar = { __index = Car }
-- this table will be used as the metatable for all instances of Car
-- Lua will look in Car for attributes it can't find in the instance
Ad esempio:
-- instance table is called mustang
-- setmetatable(mustang, metaCar)
Ecco una funzione di uso generale che crea nuovi oggetti istanza e imposta il metatabella per esso. Se il CAT ha una funzione di costruzione (init), viene eseguito anche.
function newObj(metatable)
..obj = {} -- create new empty instance object
..setmetatable(obj, metatable) –- connect the metatable to it
..if obj.init then -- if the CAT has an init method, execute it
....obj:init()
..end
..return obj
end
fonte
2013-12-06 17:45:33
Ho trovato questo "tutorial" su Lua [ereditarietà] (http: // lua-users.org/wiki/InheritanceTutorial) particolarmente illuminante in combinazione con questa risposta. – Indolering
@Indolering Grazie. Ho inserito il tuo link nella risposta. –