把表直接与字符串拼接:local msg = "玩家:" .. playerInfo,报 attempt to concatenate a table value——拼接同样有元方法回退,__concat 定义表转字符串的行为。学员常在日志输出处反复踩这个错,每次都手写 tostring 包一层,却不知道可以一劳永逸挂元方法。错误场景:
local player = { name = "甲", level = 60 }
print("玩家信息:" .. player)
表拼接字符串直接报错,日志输出中断。
挂 __concat 元方法定义表的字符串化行为。规范写法。示例代码如下:
local mt = {
__concat = function(a, b)
local ta = type(a) == "table" and a.name or a
local tb = type(b) == "table" and b.name or b
return ta .. "|" .. tb
end,
}
local p = setmetatable({ name = "甲" }, mt)
local line = "攻城报名:" .. p .. "|状态:已确认"
print(line)
__concat 在字符串与表拼接时被调用,参数顺序可能是表在前或在后,元方法内要做双向分支。示例代码如下:
local info = p .. "|已确认"
表在前的拼接同样走 __concat,双向都安全。
三步验证:配元表后字符串拼表输出 name 字段而非表地址;反向(表拼字符串)同样生效;去元表复现 attempt to concatenate 报错。
__concat 与 __tostring 分工不同:__tostring 服务 print 与 tostring,__concat 服务拼接表达式,两者都定义可覆盖两类场景。示例代码如下:
__tostring = function(t)
return "玩家(" .. t.name .. ")"
end,
__concat = function(a, b)
return tostring(a) .. tostring(b)
end,
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
一、抛坑提问:封禁词 80 个,逐个替换要扫 80 遍正文,命中次数还全丢——一次遍历配合词表命中统计,命中几个词、各命中几…
一、一行代码拆解:if BAG = CAP then return false end —— 入包前先查空位的容量闸:格子满…
一、抛坑提问:掉落表 200 个物品权重排到眼花——先掷"掉不掉、掉哪个稀有度",再在该稀有度池里抽物品,两段判定让每张表都…
一、抛坑提问:两名队员 0.5 秒内先后命中才算"合击"触发额外伤害——命中时间戳各自独立,怎么判定够近?用后发命中时间减先…
一、线上事故:组队结算页开着时玩家掉线,内存里的待领奖数据直接蒸发,3 小时收到 170 条丢失反馈;登出钩子把未决数据统一…
一、抛坑提问:背包里 4 组"金创药×30"占 4 格,为什么不能叠成一格 120 瓶?按物品 id 归并计数,同 id 累…