Tabla de contenido
Configuración y obtención de metatabla:
La relación de búsqueda entre la tabla y la metatabla:
1. Introducción al blog
Este artículo, como nota de estudio de Lua, habla sobre el contenido relacionado de la metatabla de Lua. El contenido principal incluye qué es la metatabla, cómo usar la metatabla y el propósito de algunos metamétodos. Los puntos de conocimiento se extraen del tutorial para novatos , y los lectores pueden ir directamente al contenido relevante de la metatabla de Lua en el tutorial para novatos Hay un portal en la parte inferior de la publicación del blog.
2. Contenido
¿Qué es una metatabla?
Una metatabla es una tabla, esta tabla tiene un meta método predeterminado y atributos de método personalizados, y se puede usar como una descripción de otra tabla, esta tabla se puede llamar metatabla
El papel de la metatabla:
mytable = {}
mymetatable = {}
Cuando configuras la tabla mymetatable como metatabla de la tabla mytable, mytable puede disfrutar de todas las propiedades y métodos de mymetatable, como la herencia. Cuando llames a las propiedades o métodos en mytable, si no puedes encontrarlo, irás a su metatabla. Vuelva a buscar dentro de la tabla, si se realizan algunas operaciones aritméticas en la tabla, se activarán algunos metamétodos predeterminados relacionados en la metatabla
Configuración y obtención de metatabla:
mytable = {} -- 普通表
mymetatable = {} -- 元表
setmetatable(mytable,mymetatable) -- 把 mymetatable 设为 mytable 的元表
getmetatable(mytable) -- 这回返回mymetatable
mytable = setmetatable({},{})
Podemos establecer una tabla como metatabla de otra tabla a través de setmetatable. Este método devuelve una tabla con mymetatable como metatabla, por lo que se puede abreviar directamente en la forma de mytable = setmetatable ({}, {}), podemos también pase getmetatable para obtener la metatabla de una tabla, esta metatabla puede ser nula.
La relación de búsqueda entre la tabla y la metatabla:
mytable = {}
mymetatable = {}
setmetatable(mytable,mymetatable)
mymetatable.__index = mymetatable
mymetatable.key2 = 100
print(mytable.key2)
--------------------------输出
100
La metatabla tiene algunos metamétodos predeterminados y algunos atributos. Todos estos atributos de método comienzan con dos barras inferiores (__). Aquí, el atributo predeterminado más importante de una metatabla es __index. __Index se puede establecer en cualquier tipo de datos. Cualquiera de los métodos o tabla. Aquí debemos enfatizar el orden de búsqueda después de llamar al atributo. Como se muestra en el código anterior, si llamamos a un atributo key2 en mytable, encontraremos que no hay un atributo key2 en mytable, y luego Irá a la metatabla mymetatable de mytable para encontrar key2. De hecho, no está directamente en mymetatable para encontrar key2, sino en el atributo __index de mymetatable, por lo que en lo anterior configuré __index en mymetatable en sí mismo, de modo que se pueda encontrar el atributo key2 en mymetatable
Orden de búsqueda:
1. Primero busque si hay key2 en mytable y regrese si existe
2. Si key2 no existe en mytable, primero busque si hay una metatabla en mytable y finalice si no existe.
3. Hay una metatabla mymetatable en mytable, busque key2 en __index en mymetatable, regrese si existe y finalice si no existe
Propósito de los metamétodos:
local mytable1 = {1,2,3}
local mytable2 = {4,5,6}
print(mytable1 + mytable2)
Como se muestra en el código anterior, en circunstancias normales, no podemos realizar directamente operaciones de suma, resta, multiplicación y división en las dos tablas, y se informará un error, pero si hay una metatabla, algunos metamétodos en la metatabla serán se activa cuando se encuentra el operador. Por ejemplo, el método + activará el método __add en la metatabla.
local mytable1 = {1,2,3}
local mytable2 = {4,5,6}
mymetatable = {}
setmetatable(mytable2,mymetatable)
function mymetatable:__add(table1,table2)
return 1
end
print(mytable1 + mytable2)
-------------------------输出
1
Como se muestra en el código anterior, si hay un comportamiento de adición de tablas y tablas, juzgará si la tabla tiene una metatabla en el orden de adición. Si hay una metatabla, si hay un meta método __add en el metatabla, y luego llame al primer método __add encontrado, el método __add tiene un valor de retorno, si no hay metatabla o no hay método __add en la metatabla, la compilación falla. Los metamétodos relacionados con los cálculos se enumeran a continuación , y algunos lectores de metamétodos no relacionados con operaciones pueden consultar el tutorial para principiantes.
__agregar | El operador correspondiente '+'. |
__sub | El operador correspondiente'- '. |
__Tengo | El operador correspondiente '*'. |
__div | El operador correspondiente '/'. |
__modificación | El operador correspondiente '%'. |
__unm | El operador correspondiente'- '. |
__concat | El operador correspondiente '...'. |
__eq | El operador correspondiente '=='. |
__lt | El operador correspondiente '<'. |
__la | El operador correspondiente '<='. |
3. Empuje
Github: https: //github.com/KingSun5
Tutorial para principiantes metatabla de Lua: https://www.runoob.com/lua/lua-metatables.html
4. Conclusión
Las metatablas tienen una amplia gama de funciones. Una de ellas es implementar la herencia como una simulación orientada a objetos. Este blog se trata de aquí. Si cree que el artículo del blogger está bien escrito, es posible que desee prestar atención al blogger , como la publicación del blog, y blog en otro. La capacidad principal es limitada. Si hay algún error en el artículo, puede comentar y criticar.
Grupo de intercambio QQ: 806091680 (Chinar)
Este grupo fue creado por el blogger de CSDN Chinar, ¡lo recomiendo! ¡Yo también estoy en el grupo!