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

为lua table写保护变成只读

2015-11-26 22:11 447 查看
local function readOnly(t)
local newTable = {}
local mt = {
__index=t,
__newindex=function(t, k, v)
error("read only!");
end
}
setmetatable(newTable, mt);
return newTable
end

local tbl = readOnly({"A", "c"})
通过readOnly返回的表是无法进行赋值操作的。
</pre><pre name="code" class="plain">因为readOnly会创建一个新的空table,并把传进去的table 作为_index的元方法。
元表里还增加了一个_newindex,用来阻止不存在字段的赋值操作。
通过readOnly返回的表已经不是原来的tale了,只是一个空的table,但是它被设置了一个新的元表。
例如 tbl[1] = "B",对tbl的第一个元素进行赋值操作,实际上tbl是一个空的table 根本不存在 1 这个字段,所以会调用_newindex的元方法 去对table进行更新。由于重写了_newindex的元方法,所以会触发报错信息。
如果只是调用tbl,而不去对其进行赋值。例如print(tbl[1]),则能正常输出“A”,因为tbl元表里有_index元方法,虽然tbl中不存在 1 这个字段,但可以通过_index找到这个字段。
</pre><pre name="code" class="plain">注:rawget(table, key) 可以忽略元表的_index功能(就是不通过_index的元方法进行查找) 取出table中key字段的值
rawest(table, key, value) 可以忽略元表的_newindex功能(就是不通过_newindex的元方法对表的不存在区域值进行更新)直接更新表key字段区域的值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: