学员尝试让两张表直接相加实现数值合并:local total = tableA + tableB,直接报 attempt to perform arithmetic on a table value——表默认不支持算术运算,参与加减需要元表提供 __add 元方法。没配元方法的表参与任何算术都会报错,错误行指向算术表达式本身。错误场景:
local a = { gold = 100 }
local b = { gold = 200 }
local total = a + b
表加表直接报错,没有元方法回退。
setmetatable 挂上 __add 元方法,定义表加表的行为。规范写法。示例代码如下:
local mt = {
__add = function(x, y)
return { gold = x.gold + y.gold }
end,
}
local a = setmetatable({ gold = 100 }, mt)
local b = setmetatable({ gold = 200 }, mt)
local total = a + b
print(total.gold)
a 与 b 共用同一张元表,加法回退到 __add 定义的合并逻辑,返回新的合并表。示例代码如下:
local mt2 = {
__sub = function(x, y)
return { gold = x.gold - y.gold }
end,
}
__sub 对应减法、__mul 对应乘法,算术族元方法一一对应。
三步验证:配元表后 a + b 返回 gold 为 300 的表;去掉元表复现 attempt to perform arithmetic 报错;混用带元表与不带元表的表相加,验证回退只在双方都有元方法语义时才成立(右操作数元表也可提供 __add)。
算术元方法同样支持表与数字混算:第二个参数可能是数字,元方法内要做类型分支。示例代码如下:
__add = function(x, y)
if type(x) == "number" then
return { gold = y.gold + x }
end
return { gold = x.gold + y }
end
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
一、抛坑提问:封禁词 80 个,逐个替换要扫 80 遍正文,命中次数还全丢——一次遍历配合词表命中统计,命中几个词、各命中几…
一、一行代码拆解:if BAG = CAP then return false end —— 入包前先查空位的容量闸:格子满…
一、抛坑提问:掉落表 200 个物品权重排到眼花——先掷"掉不掉、掉哪个稀有度",再在该稀有度池里抽物品,两段判定让每张表都…
一、抛坑提问:两名队员 0.5 秒内先后命中才算"合击"触发额外伤害——命中时间戳各自独立,怎么判定够近?用后发命中时间减先…
一、线上事故:组队结算页开着时玩家掉线,内存里的待领奖数据直接蒸发,3 小时收到 170 条丢失反馈;登出钩子把未决数据统一…
一、抛坑提问:背包里 4 组"金创药×30"占 4 格,为什么不能叠成一格 120 瓶?按物品 id 归并计数,同 id 累…