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
Véase también: Fin de cerda de responsabilidad
Copyright © Robert Schmitz 2006