Lua中__index元方法读取表时未执行问题求助
Lua __index元方法未触发的原因及解决办法
你忽略了Lua元表中__index的核心触发规则:只有当访问的键在目标表中不存在时,__index才会被调用。你的m.scalars表本身已经包含width、height、x、y这些键,所以直接返回表内存储的原始值,完全不会触发元表的__index方法。
解决办法
这里提供两种可行的实现思路:
思路一:用内部表存储原始值
让外部代理表本身不包含目标键,把原始数据存在内部表中,__index从内部表读取并计算:
local scalar = 2 local scalar_template = { __index = function(t, k) print('hi?') -- 现在会正常触发 return t._raw[k] * scalar end } local m = {} m.scalars = setmetatable({ _raw = {width = 2, height = 1, x = 10, y = 10} }, scalar_template) print(m.scalars.width) -- 输出4 scalar = 2.5 print(m.scalars.width) -- 输出5
思路二:用独立的原始数据表
让代理表为空,__index直接读取外部的原始数据表并计算:
local scalar = 2 local raw_scalars = {width = 2, height = 1, x = 10, y = 10} local scalar_template = { __index = function(t, k) print('hi?') return raw_scalars[k] * scalar end } local m = {} m.scalars = setmetatable({}, scalar_template) print(m.scalars.width) -- 输出4 scalar = 2.5 print(m.scalars.width) -- 输出5
如果需要支持修改这些值的功能,还可以给元表添加__newindex方法,同步更新原始数据。
内容的提问来源于stack exchange,提问作者Roland
相关产品推荐
相关产品推荐

