总的来说就是利用LUA的元表的两个方法:
    __index:当读不存在的键值时调用的,即当真实的键没有时,则会尝试在 index 中进行查找,如果能找到则由 index 进行返回,所以 index 相当于一个默认初始值
    **
    newindex**:当写不存在的键值使用的,当写的键没有时,则用这个方法进行返回

    1. -- 实现一个定义只读表的函数
    2. function readonly_table(t)
    3. local ret = {}
    4. local mt = {
    5. __index = t,
    6. __newindex = function(_,k,v)
    7. print("readonly table!")
    8. end
    9. }
    10. setmetatable(ret,mt)
    11. return ret
    12. end
    13. local test_readonly=readonly_table{a = "1", b = "2", c = "3"}
    14. -- 请注意,这里不能使用迭代器来迭代 test_readonly,因为是没有真实的键,除非重写__pairs,让__pairs去迭代__index,所以这里是没有输出的
    15. for k,v in pairs(test_readonly) do print(k,"==>",v) end
    16. -- 进行读,表明可读
    17. print(test_readonly['a'])
    18. -- 进行写,提示不可写
    19. test_readonly['d']="4";