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à 30Altres 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 40Conclusió
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
