您的位置:首页 > 编程语言 > Lua

lua 只读表

2017-08-31 18:19 387 查看

–对于制度表中的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 元方法 只读表