Lua Logo
Metatables

Cómo debíamos saber hasta ahora ya, se no puede hacer sin más con tables algunas cosas.
Sin embargo Metatables dan a dar la posibilidad a Table instrucciones que debe suceder en un acceso no permitido de lo contrario en table.
Cada uno table o userdata object en Lua puede tener Metatable.
Wie wir bis jetzt schon wissen sollten, kann man mit tables einige Sachen nicht ohne weiteres machen.

Ejemplos de accesos no permitidos:

  • + sumar
  • - restar
  • * multiplicar
  • etc.


¿Cómo hace lua ello?

Esto es producido simplemente table en el cual funciones están que son llamadas en caso de tal acción.

Si un Addition con tables es intentado, busca lua una función __ add en éste table. Si esta función es disponible, ella es exportada.

Tenemos que ante todo hacer en ello sin embargo table y luego asignar otro table.

Producen de Funktionstables:

metaT={} -- Table está nacido
metaT.__add = function( table1, table2 )
-- ahora todas las instrucciones entran aquí,
-- en caso de un Addition de tables
-- deben ser llevados a cabo.
end

Natürlich können wir auch gleichzeitig für andere Handlungen eine Funktion zuweisen:

metaT.__sub = function( table1, table2 )
-- ahora todas las instrucciones entran aquí,
-- en caso de un Subtraktition de tabless
-- deben ser llevados a cabo.
end
metaT.__mul = function( table1, table2 )
-- ahora todas las instrucciones entran aquí,
-- en caso de una multiplicación de tables
-- deben ser llevados a cabo.
end

etcétera. La lista de las posibilidades es voluminosa(amplia). Con aire de importancia debe ser sabido ante todo(al principio) como uno hace una función para una acción determinada.

ahora tenemos que asignar todavía table Metatable.

Esto sucede simplemente con:


setmetatable(miTable, metaT)

Lo que está en las funciones, es perfecto(completo) nos dejan. Sólo el valor de devolución es importante.
Si suponemos una vez, queremos sumar una posición en la X dirección 100 y en la Y dirección 500

pos = { X = 1205, Y = 5241 }
diff = { X = 100, Y = 500 } -- nuestra diferencia

Si escribiríamos ahora:

resultado = pos + diff

Luego tendríamos una falta gruesa(gorda).(attempt to perform arithmetic on global `pos' (a table value) )

Si hacemos Metatable

metaT={} -- Table está nacido
metaT.__add = function( table1, table2 )
local table3 = {}
table3.X = table1.X + table2.X
table3.Y = table1.Y + table2.Y
return table3
end
setmetatable(pos, metaT)
resultado = pos + diff

Esto va naturalmente más simplemente sin embargo no es tan claro:

metaT={} -- Table está nacido
metaT.__add = function( table1, table2 )
return {X = table1.X + table2.X, Y = table1.Y + table2.Y }
end
setmetatable(pos, metaT)
ergebnis = pos + diff

Luego nos dejamos imprimir el resultado:









Función El caso de empleo (es llamado si:)
__add Addition
__sub Sustracción
__mul Multiplication
__div División
__pow Potenzierung
__unm Si table proveerá del operador -
__contact Si dos son atados(combinados) tables con ..
__it dos tables se hacen con
__le dos tables se hacen con <=
__index Un valor que no hay en table era llamado.
__newindex Si table un nuevo elemento sienta. Z.B x y y son disponibles, z es definido.
__call Si algún valor era llamado
__mode
__metatable
__tostrimg Si la función tostring en table es usada
__gc
La multiplicación de las informaciones contenidas en estos lados(costados) y los artes gráficos(los dibujos) está prohibida, de modo destripado(excluido) de eso es todo el código de manantial indicado en estos lados(costados).
Véase también: Fin de cerda de responsabilidad
Copyright © Robert Schmitz 2006