lua只读table

在C++中, 可以使用const来修饰变量, 将变量设置为常量, 防止数据被修改
在lua中是没有const的, 但是对于table可以用过metatable来达到类似的目的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
readonlytb = function(tb, deep)
if deep then
for k, v in pairs(tb or {}) do
if type(v) == "table" then
tb[k] = _readonlytb(v, deep)
end
end
end
local meta = {
-- 当我们访问一个表不存在的域时, 解释器会去查找调用__index元方法
__index = tb,
-- 当对table进行更新时, 对应的域不存在, 就会查找调用__newindex元方法
__newindex = function()
assert(false, "table is readonly")
end,
-- 需要__pairs元方法, 方便用户遍历table, 否则只会遍历这个table自己的数据, 不会遍历继承到的数据
__pairs = function(...)
return pairs(tb)
end
}
local t = {}
setmetatable(t, meta)
return t
end