Las notas de estudio de Lua usan metatabla para hacer una tabla de solo lectura

Tabla de contenido

1. Introducción al blog

2. Contenido

3. Empuje

4. Conclusión


1. Introducción al blog

Este blog se utiliza como nota de estudio para Lua. Registre el uso de metatablas y metamétodos para crear una tabla de solo lectura. Este blog requiere una cierta comprensión del conocimiento relacionado con las metatablas. Si no comprende las metatablas, puede saltar a la La publicación anterior del blog de blogger sobre la metatabla tiene una puerta de transferencia al final del artículo.


2. Contenido

En primer lugar, entendemos que hay una tabla vacía en Lua, podemos realizar casi cualquier operación en ella, podemos obtener el valor correspondiente de acuerdo con la clave correspondiente, o agregar el valor correspondiente de acuerdo con la clave correspondiente, como se muestra a continuación. :

local testTable = {}

testTable.width = 10

print(testTable.name)     --------nil

¿Cómo creamos una tabla de solo lectura? Después de entender la metatabla a través de la metatabla, podemos saber que cuando accedemos a una tabla con una metatabla, lo primero que debemos hacer es acceder al meta método __index de la metatabla .Al asignar una tabla con una metatabla, primero accederemos al meta método __newindex de la metatabla, luego el resultado es obvio, podemos establecer una tabla proxy vacía para la tabla, la tabla vacía establece la metatabla, y el meta tabla __index Devuelve la tabla proxy, __newindex lanza una excepción, para que se pueda realizar una tabla de solo lectura, el siguiente ejemplo:

----------------------------------------首先我们准备一个需要被设置为只读的表
local testTable = {}
testTable.width = 10
testTable.print = function()
	print("Sun")
end

----------------------------------------该方法将表设置为只读
function setOnlyRead(t)
	--代理的空表
	local proxy = {}
	--空表的元表
	local meta = {
		--被访问的时候就返回被代理的表
		__index = t,
		--赋值的时候直接抛出异常
		__newindex = function(t,k,v)
			error("this table is a read-only table")
		end
	}
	--设置元表
	setmetatable(proxy,meta)
	--将代理返回
	return proxy
end

local readOnlyTable = setOnlyRead(testTable)

print(readOnlyTable.width)				------10
readOnlyTable.print()              		        ------Sun
readOnlyTable.hhh = 100					------报错


3. Empuje

Github: https: //github.com/KingSun5

Metatabla: https://blog.csdn.net/Mr_Sun88/article/details/105205942


4. Conclusión


        El principio es muy simple, y el método de escritura también es muy simple. Si crees que el artículo del blogger está bien escrito, es posible que desees prestar atención al blogger y dar me gusta a la publicación del blog. Además, la capacidad del blogger es limitada. Si hay algún error en el artículo, por favor comente y critique.

       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/105648580
Recomendado
Clasificación