lua 只读表

–对于制度表中的proxy理解不透彻,做了一下实验

--只读表 1st.
--[[ --只读表的错误用法实验
local function readOnly(t)
    local proxy = {}
    local mt = {
        __index = proxy,
        __newindex = function(t,k,v)
            error("attempt to update a read-only table", 2)
        end
    }
    setmetatable(t, mt)
    return t
end

local words = {'a','b','c'}
local readOnlyWords = readOnly(words)
print(readOnlyWords[1])
readOnlyWords[1] = 'd'
print(readOnlyWords[1])
]]
--[[

--只读表  2nd.

--解释,根据示例2
local function readOnly(t)
    local proxy = {}
    local mt = {
        __index = t,
        __newindex = function(t,k,v)
            error("attempt to update a read-only table", 2)
        end
    }
    setmetatable(proxy, mt)
    return proxy
end

local sevenDay = {"Monday", "TuesDay", "WednessDay", "ThursDay", "Friday", "Saturday", "Sunday"}

local t = readOnly(seavenDay)
print(t[1])
t[2] = "SunDay"


]]
  • 实验一 和 实验二 分别是使用proxy和不使用proxy的情况,
  • 实验一中如果不使用proxy,那么t的元表就是mt,
  • 当传入的t中已经附着了对应的属性时,读取无法触发__index,如果修改这个对应的属性值,也无法触发__newindex
  • 结果就是无法实现只读的效果
  • 实验二中使用了proxy, 当读取时,proxy肯定会触发__index,回去读取t的值,更新时也一定会触发__newindex,此时阻止更新值就OK了

    结论: proxy = {} 保证了 __index, __newindex的必定执行,从而达到控制是否只读的效果

你可能感兴趣的:(lua程序设计,lua,元方法,只读表)