Notas de estudio de Lua sobre la metatabla de Lua

Tabla de contenido

1. Introducción al blog

2. Contenido

¿Qué es una metatabla?

El papel de la metatabla:

Configuración y obtención de metatabla:

La relación de búsqueda entre la tabla y la metatabla:

Propósito de los metamétodos:

3. Empuje

4. Conclusión


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!

Supongo que te gusta

Origin blog.csdn.net/Mr_Sun88/article/details/105205942
Recomendado
Clasificación