首先找到元表枚举
1 | typedef enum { |
在里面添加一个元素 TM_ASSIGN
再找到void luaT_init
函数
1 | void luaT_init (lua_State *L) { |
在里面添加__assign
最后找到void luaV_settable
函数
下面这段源码有些函数作用是猜想的 可能并不是很准确 lua5.2.4的函数 可能版本之间有着小差异 但是只要理解了 我想应该都不影响
lua 5.2.4源码
1 | void luaV_settable(lua_State *L, const TValue *t, TValue *key, StkId val) |
经过上面的操作 __assign 可以这样使用1
2
3
4
5
6
7
8tab = { --只读元表
__assign = function(t,k,v) --对已有的key值不能进行操作
error('read only __assign:' .. tostring(k).. '__'.. tostring(v))
end,
__newindex = function(t,k,v) --不能进行表的写入
error('read only __newindex:' .. tostring(k)..'__'.. tostring(v))
end,
}
如果这个表中 新插入的键值是已有的 就会走到这
lua 5.1.5源码
1 | void luaV_settable(lua_State *L, const TValue *t, TValue *key, StkId val) |
MAXTAGLOOP
如果用元方法继承 层次操作这个值 就会失效 有必要的时候阔以自己调整 (这个是方法链限制 避免循环)