总的来说就是利用LUA的元表的两个方法:
__index:当读不存在的键值时调用的,即当真实的键没有时,则会尝试在 index 中进行查找,如果能找到则由 index 进行返回,所以 index 相当于一个默认初始值
**newindex**:当写不存在的键值使用的,当写的键没有时,则用这个方法进行返回
-- 实现一个定义只读表的函数
function readonly_table(t)
local ret = {}
local mt = {
__index = t,
__newindex = function(_,k,v)
print("readonly table!")
end
}
setmetatable(ret,mt)
return ret
end
local test_readonly=readonly_table{a = "1", b = "2", c = "3"}
-- 请注意,这里不能使用迭代器来迭代 test_readonly,因为是没有真实的键,除非重写__pairs,让__pairs去迭代__index,所以这里是没有输出的
for k,v in pairs(test_readonly) do print(k,"==>",v) end
-- 进行读,表明可读
print(test_readonly['a'])
-- 进行写,提示不可写
test_readonly['d']="4";