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.

local myTable = {}
local myMetatable = {}

setmetatable(myTable, myMetatable)

Obtenir la Metataula

Podem obtenir la metataula d'una taula utilitzant la funció getmetatable.

local mt = getmetatable(myTable)
print(mt)  -- Això imprimirà la metataula associada a myTable

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.

© Copyright 2024. Tots els drets reservats