Lua elemento de la tabla (metatabla)
En la tabla Lua, podemos acceder al valor de la clave correspondiente para obtener el valor, pero no puede funcionar con dos tipos de tabla.
Por lo tanto, Lua proporciona un elemento de la tabla (metatabla), mesa nos permite cambiar el comportamiento de cada acción asociada con el método de los elementos correspondientes.
Por ejemplo, utilizando la tabla de meta, podemos definir la forma en la tabla Lua para calcular la suma de dos operaciones a + b.
Cuando Lua intento de añadir dos tablas, en primer lugar comprobar si hay uno de dos tipos de tabla de yuanes, después de comprobar si existe un lugar llamado "__add" campo, si se encuentra, a continuación, llamar al valor correspondiente. "__add" Y otro campo instante, el valor correspondiente (a menudo una función o una mesa) es el "Método de los Elementos."
Hay dos funciones muy importantes para manejar la tabla de yuanes:
- setmetatable (mesa, metatabla): poner la mesa para el elemento de la tabla especificada (metatabla), si hay __metatable tabla elemento clave (metatabla) en, setmetatable fallar.
- getmetatable (tabla): Devuelve la tabla de objetos de metadatos (metatabla).
El siguiente ejemplo muestra cómo poner la mesa para el elemento de la tabla especificada:
mytable = {} -- 普通表 mymetatable = {} -- 元表 setmetatable(mytable,mymetatable) -- 把 mymetatable 设为 mytable 的元表
El código anterior se puede escribir directamente a la línea:
mytable = setmetatable({},{})
A continuación se presentan la tabla de retorno objeto de metadatos:
getmetatable(mytable) -- 这回返回mymetatable
Método de los Elementos __index
Esta es la clave metatabla más comúnmente utilizado.
Cuando se pasa la clave para acceder a la tabla, y si la clave no tiene ningún valor, entonces Lua se encuentra la mesa de metatabla (suponiendo metatabla) en la clave __index. Si __index contiene una tabla, Lua se encuentra la tecla correspondiente en la tabla.Podemos usar el comando lua para entrar en modo interactivo Vistas:
$ lua Lua 5.3.0 Copyright (C) 1994-2015 Lua.org, PUC-Rio > other = { foo = 3 } > t = setmetatable({}, { __index = other }) > t.foo 3 > t.bar nil
Si __index contiene una función, entonces, LUA llamará esa función, mesa y se pasó las teclas como un parámetro a la función.
método de los elementos __index para ver el elemento de la tabla que existe, si no, devolver el resultado es nulo; si es que existe por __index resultados de retorno.
mytable = setmetatable({key1 = "value1"}, { __index = function(mytable, key) if key == "key2" then return "metatablevalue" else return nil end end }) print(mytable.key1,mytable.key2)
Ejemplos de salida es:
value1 metatablevalue
ejemplos de análisis:
mitabla mesa asignada{clave1 = "valor1"}.
mitabla mesa puesta meta método de los elementos __index.
Encuentra key1 en la tabla mitabla, si lo encuentra, volver ese elemento no se encuentra, continúe.
Encuentra clave2 en la tabla mitabla, si lo encuentra, metatablevalue volver, encontrar continua.
Analizando la tabla meta no tiene un método __index, si __index método es una función, llamar a la función.
- método de los elementos para comprobar si "clave2" parámetro clave (juego mytable.key2) entrante, si el entrante "Key2" retornos de parámetros "metatablevalue", de lo contrario tecla correspondiente mitabla.
Podemos escribir el código anterior es simple:
mytable = setmetatable({key1 = "value1"}, { __index = { key2 = "metatablevalue" } }) print(mytable.key1,mytable.key2)
resumen
Lua de búsqueda de reglas de un elemento de la tabla cuando, de hecho, los tres pasos siguientes:
- 1. Buscar en la tabla, si lo encuentra, volver ese elemento, no lo encuentra, continuará
- 2. determinar si la tabla tiene mesa de RMB, si no hay una mesa de ping-elemento, nula rentabilidad, no se continuó dólar.
- 3. Analizando la tabla meta no tiene un método __index, si __index método es nulo, nulo retorno; si __index método es una mesa, repetir 1,2,3; si __index método es una función, la función devuelve valor de retorno.
Método de los Elementos __newindex
método de los elementos __newindex se utiliza para actualizar la tabla, __ índice se utiliza para acceder a la tabla.
Cuando le das a una asignación de tabla de índices que faltan, el intérprete se verá __newindex Método de los Elementos: Si se llama a esta función sin asignación.
El siguiente ejemplo demuestra Método de los Elementos de la aplicación __newindex:
mymetatable = {} mytable = setmetatable({key1 = "value1"}, { __newindex = mymetatable }) print(mytable.key1) mytable.newkey = "新值2" print(mytable.newkey,mymetatable.newkey) mytable.key1 = "新值1" print(mytable.key1,mymetatable.key1)
Los ejemplos de la aplicación de la salida anterior es:
value1 nil 新值2 新值1 nil
Los ejemplos de las tablas anteriores establecidas método de los elementos __newindex, cuando la nueva clave de índice (newkey) asignación (mytable.newkey = "nuevo valor 2"), va a llamar método de los elementos sin asignación. Y si una clave de índice existente (key1), llevará a cabo la tarea, sin llamar Método de los Elementos __newindex.
En el siguiente ejemplo se utiliza la función rawset para actualizar la tabla:
mytable = setmetatable({key1 = "value1"}, { __newindex = function(mytable, key, value) rawset(mytable, key, "\""..value.."\"") end }) mytable.key1 = "new value" mytable.key2 = 4 print(mytable.key1,mytable.key2)
Los ejemplos de la aplicación de la salida anterior es:
new value "4"
Añadir operador de la mesa
El siguiente ejemplo muestra dos tablas añaden operación:
-- 计算表中最大值,table.maxn在Lua5.2以上版本中已无法使用 -- 自定义计算表中最大值函数 table_maxn function table_maxn(t) local mn = 0 for k, v in pairs(t) do if mn < k then mn = k end end return mn end -- 两表相加操作 mytable = setmetatable({ 1, 2, 3 }, { __add = function(mytable, newtable) for i = 1, table_maxn(newtable) do table.insert(mytable, table_maxn(mytable)+1,newtable[i]) end return mytable end }) secondtable = {4,5,6} mytable = mytable + secondtable for k,v in ipairs(mytable) do print(k,v) end
Los ejemplos de la aplicación de la salida anterior es:
1 1 2 2 3 3 4 4 5 5 6 6
__add elemento clave que figura en la tabla, y añadir operación. Una lista de las acciones correspondientes a la siguiente tabla:
modo | descripción |
---|---|
__add | correspondiente operador '+'. |
__sub | correspondiente operador '-'. |
__mul | correspondiente operador '*'. |
__div | correspondiente operador '/'. |
__mod | correspondiente operador '%'. |
__unm | correspondiente operador '-'. |
__concat | operador correspondiente '..'. |
__eq | correspondiente operador '=='. |
__lt | correspondiente operador '<'. |
__le | correspondiente operador '<='. |
Método de los Elementos __call
método de los elementos __call se llama cuando se llama a un valor Lua. El siguiente ejemplo ilustra la tabla de cálculo de los elementos, y:
-- 计算表中最大值,table.maxn在Lua5.2以上版本中已无法使用 -- 自定义计算表中最大值函数 table_maxn function table_maxn(t) local mn = 0 for k, v in pairs(t) do if mn < k then mn = k end end return mn end -- 定义元方法__call mytable = setmetatable({10}, { __call = function(mytable, newtable) sum = 0 for i = 1, table_maxn(mytable) do sum = sum + mytable[i] end for i = 1, table_maxn(newtable) do sum = sum + newtable[i] end return sum end }) newtable = {10,20,30} print(mytable(newtable))
Los ejemplos de la aplicación de la salida anterior es:
70
Método de los Elementos __toString
método de los elementos __toString se utiliza para modificar el comportamiento de la tabla de salida. Los siguientes ejemplos de nuestra mesa de salida personalizado de contenidos:
mytable = setmetatable({ 10, 20, 30 }, { __tostring = function(mytable) sum = 0 for k, v in pairs(mytable) do sum = sum + v end return "表所有元素的和为 " .. sum end }) print(mytable)
Los ejemplos de la aplicación de la salida anterior es:
表所有元素的和为 60
A partir de este artículo podemos saber mesa de elemento puede ser una buena simplificar nuestra función de código, por lo que comprender Lua mesa de meta nos permite escribir código Lua excelente simple.