Lua 中 setmetatable 的使用及 metatable 说明(公众号笔记)
ABSTRACT
2018-02 公众号笔记。讲 Lua 元表(metatable)机制:setmetatable + __index 实现继承的惯用法(含 tolua 的 getpeer/setpeer 写法),以及 __add、__index、__newindex 等常用元方法速查。
核心要点
- 继承惯用法:
setmetatable(obj, { __index = 父模块 }),obj 查不到的键转而去父模块中查找,构成 Lua 实现继承的基石。 - tolua 场景写法:
tolua.getpeer/setpeer拿到 C# 对象对应的 Lua 表,再 setmetatable 挂到模块上实现 extend。 - metatable(元表):每个值都可挂一个普通 table 作为元表,定义该值在特定操作下的行为;Lua 遇到对应操作时检查元表中是否有对应「事件」键,有则由元方法接管。
- 常用元方法:__add/__sub/__mul/__div/__unm(算术)、__tostring(转字符串输出)、__concat(.. 连接)、__index(读取不存在键时的行为,实现继承/默认值)、__newindex(写入新键时的行为,可实现只读/监听)。
- 元表是 Lua 用极简机制表达面向对象、运算符重载、代理拦截的核心设计。
关键实体与概念
setmetatable、metatable、__index、__newindex、元方法、tolua.getpeer、继承、运算符重载
关联概念
来源回溯
- 原始文件:
raw/ip/wechat_articles/Lua中setmetatable的使用及metatable说明.md(2018-02-19)
时效性评估
- 仍有效:metatable 是 Lua 语言核心机制,Lua 5.x 至今语义稳定;__index 继承模式仍是所有 Lua 游戏框架(xlua、tolua、Love2D 项目)的标准写法。
- 已过时:tolua 的 getpeer/setpeer 属于特定绑定库 API,xlua 等现代绑定写法不同;Lua 5.4 新增
close元方法(__close)等细节本文未覆盖,但基础机制无变化。