lua 里有一个__index metamethod,当我们访问一个表不存在的域时,会触发lua解释器去查找__index metamethod: 如果不存在,返回结果nil,如果存在,则由__index metamethod返回结果。
__newindex metamethod 是用来对表进行更新,当你给一个表缺少的域赋值,解释器就会查找__newindex metamethod,如果存在则调用这个函数,而不进行赋值操作。另外有一个 raw metamethod可经绕过__newindex metamethod。
我只须重写:__index metamethod 和__newindex metamethod 便可达到让表只读的目的。
代码如下:
function table_read_on
local temp= t or {}
local mt = {
__index = function(t,k) return temp[k] end ;
__newindex = function(t, k, v)
error("attempt to update a read-on
end
}
setmetatable(temp, mt)
return temp
end
用法:
local t_a = {1,2,3}
local t_b = table_read_on
t_b[5] = 1 --对表进行更新,会报错:attempt to update a read-on