参考《programming in lua》13.4.5中,详细介绍了只读表的用法。建立一个函数,传入一个table,传出一个代理table,其__index指向传入的table,__newIndex直接报error即可:
Lua
--输入一个table,输出一个代理table,其只读
function table.readOnly(tbTarget)
local proxy = {}
setmetatable(proxy,{
__index = tbTarget,
__newindex = function(t,k,v)
error("attempt to update a read-only table", 2)
end
})
return proxy
end
A = {}
A[1] = 1
B = table.readOnly(A)
print(B[1]) --print:1
B[2] = 2 --print:attempt to update a read-only table
B[1] = "a" --print:attempt to update a read-only table
A[1] = 2
print(B[1]) --print:2
A[2] = 3
print(B[2]) --print:3
其中有两个重要的点:
1.index重新定位至原table,但proxy本身是空表,newIndex无论是什么key都会报error,不管原table内部是否有这个key。
2.__index实际是地址形式,如若中途修改了原table内部的值,proxy代理table也会相应改变和定位。