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)等细节本文未覆盖,但基础机制无变化。