You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 03:54:29