Latest web development tutorials

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.