目录
1、博客介绍
本篇博客作为Lua的学习笔记,记录一下利用元表和元方法来制作一个只读的表,本篇博客需要对元表相关知识有一定的了解,若是对元表不了解可以先行跳转到博主前一篇关于元表的博文,文章底部设有转送门。
2、内容
首先我们了解,Lua中一个空表,我们是可以对其进行几乎任意的操作,我们可以从中根据对应键来获取相应的值,也可以根据对应的键来附加相应的值,如下所示:
local testTable = {}
testTable.width = 10
print(testTable.name) --------nil
我们如何去创建一个只读的表呢,通过元表,了解元表后我们可以知道,我们访问带有元表的表时,首先是去访问该元表的元方法 __index,当我们对带有元表的表进行赋值的时候,我们会首先访问该元表的元方法 __newindex,那么结果显而易见了,我们可以对表设置一个代理的空表,该空表设置元表,元表__index返回被代理的表,__newindex则抛出异常,如此便可以实现只读的表,以下例子:
----------------------------------------首先我们准备一个需要被设置为只读的表
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、推送
Github:https://github.com/KingSun5
元表:https://blog.csdn.net/Mr_Sun88/article/details/105205942
4、结语
原理很简单,写法也很简单,若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。QQ交流群:806091680(Chinar)
该群为CSDN博主Chinar所创,推荐一下!我也在群里!