Bienvenidos sean a este post, podemos decir que cada valor en Lua es un conjunto predecible de operaciones porque podemos agregar numeros, concatenar cadenas, insertar pares de clave-valor en tablas pero no podemos agregar tablas, comparar funciones o llamar a una cadena.

Anuncios

Para ello, las metatablas nos permiten cambiar la conducta de un valor cuando sea confrontado con una operacion indefinida, un ejemplo del uso de metatablas es la posibilidad de poder definir como Lua computa la expresion a+b donde a y b son tablas, cuando Lua trata de agregar dos tablas chequea si alguna de ellas tiene una metatabla y si esta metatabla tiene un campo __add, si Lua encuentra a este campo llama al correspondiente valor — el asi llamado metametodo que equivale a una funcion — para computar la suma.

Cada valor en Lua podria tener una metatabla, tablas y datos del usuario tiene metatablas individuales, valores de otro tipo comparten una unica metatabla para todos los valores de ese tipo, Lua siempre crea nuevas tablas sin metatablas:

t = {}
print(getmetatable(t))

Si lo ejecutamos nos devolvera un valor de nil, podemos usar setmetatable para setear o cambiar la metatabla de cualquier tabla:

t1 = {}
setmetatable(t, t1)
assert(getmetatable(t) == t1)

Cualquier tabla puede ser la metatabla de cualquier valor, un grupo de tablas relacionadas podria compartir una metatabla comun la cual describe su conducta comun, una tabla puede ser su propia metatabla, y asi describe su propia conducta individual, cualquier configuracion es valida.

Anuncios

Desde Lua podemos setear la metatablas solo de las tablas, para poder manipular las metatablas de valores de otros tipos debemos usar codigo C, la principal razon de esta restriccion es para frenar un uso excesivo de metatablas de todo tipo, experiencias con versiones mas viejas de Lua nos han mostrado que estas configuraciones frecuentemente nos direcciona a codigo no reusable, la libreria string setea una metatabla para las cadenas (mas adelante ahondaremos en este tema) todos los otros tipos no tienen metatablas por defecto.

> print(getmetatable("hola"))
table: 0x16aa1e8
> print(getmetatable(10))
nil
>

Como pueden ver al intentar obtener la tabla por getmetatable cuando es una cadena, en este caso un literal, nos devuelve un valor de memoria donde esta la metatabla, en el segundo caso al ser un numero nos devolvio un nil por lo dicho anteriormente.

Anuncios

En resumen, hoy hemos visto una breve introduccion a que se considera metatabla, como funciona, para que sirve, una brevisima mencion de metametodos, cuales son las conductas de estos, espero les haya sido util sigueme en Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00