Les metataules i els metamètodes són conceptes avançats en Lua que permeten modificar el comportament de les taules. Aquestes eines són molt poderoses i permeten crear comportaments personalitzats per a les operacions que es realitzen sobre les taules.
Què és una Metataula?
Una metataula és una taula especial que pot ser associada a una altra taula per modificar el seu comportament predeterminat. Les metataules poden contenir funcions especials anomenades metamètodes que defineixen com la taula ha de respondre a certes operacions, com ara l'addició, la concatenació, l'indexació, etc.
Creació d'una Metataula
Per crear una metataula, simplement definim una taula normal i després l'associem a una altra taula utilitzant la funció setmetatable
.
Obtenir la Metataula
Podem obtenir la metataula d'una taula utilitzant la funció getmetatable
.
Metamètodes
Els metamètodes són funcions especials que es defineixen dins d'una metataula per modificar el comportament de la taula associada. A continuació, es presenten alguns dels metamètodes més comuns:
__index
El metamètode __index
s'utilitza per personalitzar el comportament d'indexació d'una taula. Quan es busca un valor en una taula i aquest no existeix, Lua utilitza el metamètode __index
per determinar el valor a retornar.
local myTable = {} local myMetatable = { __index = function(table, key) return "Valor per defecte" end } setmetatable(myTable, myMetatable) print(myTable.someKey) -- Imprimirà "Valor per defecte"
__newindex
El metamètode __newindex
s'utilitza per personalitzar el comportament d'assignació de valors a una taula. Quan s'assigna un valor a una clau que no existeix, Lua utilitza el metamètode __newindex
.
local myTable = {} local myMetatable = { __newindex = function(table, key, value) print("Assignant " .. value .. " a " .. key) end } setmetatable(myTable, myMetatable) myTable.someKey = "Alguns Valors" -- Imprimirà "Assignant Alguns Valors a someKey"
__add
El metamètode __add
s'utilitza per personalitzar el comportament de l'operador d'addició (+
).
local myTable1 = {value = 10} local myTable2 = {value = 20} local myMetatable = { __add = function(table1, table2) return table1.value + table2.value end } setmetatable(myTable1, myMetatable) setmetatable(myTable2, myMetatable) local result = myTable1 + myTable2 print(result) -- Imprimirà 30
Altres Metamètodes
A continuació es presenta una taula amb alguns dels metamètodes més comuns i les seves funcions:
Metamètode | Funció |
---|---|
__index |
Personalitza l'indexació de la taula. |
__newindex |
Personalitza l'assignació de valors a la taula. |
__add |
Personalitza l'operador d'addició (+ ). |
__sub |
Personalitza l'operador de substracció (- ). |
__mul |
Personalitza l'operador de multiplicació (* ). |
__div |
Personalitza l'operador de divisió (/ ). |
__mod |
Personalitza l'operador de mòdul (% ). |
__concat |
Personalitza l'operador de concatenació (.. ). |
__eq |
Personalitza l'operador d'igualtat (== ). |
__lt |
Personalitza l'operador de menor que (< ). |
__le |
Personalitza l'operador de menor o igual que (<= ). |
Exercicis Pràctics
Exercici 1: Personalitzar l'Indexació
Crea una taula amb una metataula que retorni "No trobat" quan es busqui una clau que no existeix.
local myTable = {} local myMetatable = { __index = function(table, key) return "No trobat" end } setmetatable(myTable, myMetatable) print(myTable.someKey) -- Ha d'imprimir "No trobat"
Exercici 2: Personalitzar l'Addició
Crea dues taules amb un camp value
i una metataula que permeti sumar les dues taules utilitzant l'operador +
.
local myTable1 = {value = 15} local myTable2 = {value = 25} local myMetatable = { __add = function(table1, table2) return table1.value + table2.value end } setmetatable(myTable1, myMetatable) setmetatable(myTable2, myMetatable) local result = myTable1 + myTable2 print(result) -- Ha d'imprimir 40
Conclusió
Les metataules i els metamètodes són eines poderoses en Lua que permeten personalitzar el comportament de les taules. Amb aquests conceptes, pots crear comportaments avançats i personalitzats per a les teves taules, fent que el teu codi sigui més flexible i potent. Practica amb els exercicis proporcionats per consolidar els teus coneixements i prepara't per als temes més avançats del curs.
Curs de Programació en Lua
Mòdul 1: Introducció a Lua
Mòdul 2: Conceptes Bàsics
Mòdul 3: Conceptes Intermedis
Mòdul 4: Conceptes Avançats
- Coroutines
- Programació Orientada a Objectes en Lua
- Tècniques de Depuració
- Optimització del Rendiment
- Ús de l'API C de Lua
Mòdul 5: Aplicacions Pràctiques
- Construcció d'un Joc Simple
- Scripting en Motors de Joc
- Automatització de Tasques amb Lua
- Integració de Lua amb Altres Llenguatges