Lua 语言系列:1.1 一表通吃——从 table 到 metatable,一门语言如何只靠一种数据结构
你大概率没写过一行 Lua,但你的电脑每天都在跑它:Redis 的原子脚本、Nginx 的 OpenResty 插件、Wireshark 的协议解析、Neovim 的配置、魔兽世界的 UI 框架……这些八竿子打不着的软件,不约而同地选择把 Lua 嵌进去当"内脏语言"。 一门 1993 年诞生、源码只有三万多行、解释器能裁剪到 300KB 以下的小语言,凭什么被嵌入到全世界最流行的软件里? 答案藏在一个反直觉的设计里:Lua 只有一种数据结构——table(表)。数组是它,字典是它,对象是它,模块是它,连"类"都是它。这篇文章就把它拆开讲透:这一张表,到底是怎么撑起一整门语言的。 一、从哪来:为"可嵌入"而生的小语言Lua 诞生于 1993 年,作者是巴西里约热内卢天主教大学(PUC-Rio)的 Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo。"Lua"在葡萄牙语里是"月亮"的意思——这个名字本身...
Lua 语言系列:1.2 metatable 深挖——__index、__newindex 与运算符重载
你写过这样的需求吗:查不到的配置项要有默认值;这张表不许别人改;两个"向量"要能用 + 相加、用 == 比较。 在 C++ 里,这些分别对应——给类写 getter 兜底、const 或私有成员、operator+ 与 operator== 重载。在 Python 里是 __getattr__、__setattr__、__add__、__eq__。 而在 Lua 里,它们全部是同一件事:给一张表挂上一张元表(metatable),在元表里写下双下划线开头的元方法。 Lua 没有 class 关键字,也没有运算符重载语法——所有"让一张表拥有行为"的能力,都收敛到了这一张元表里。本篇把它拆到底:查、写、运算、调用、打印、销毁,每一条路径上元表站在哪里,以及那些足以让程序静默出错的坑。 元表拦在什么位置:读路径与写路径 读:t[k] rawget(t, k) 自己身上有吗? nil metatable.__index 表:去那张表找 非 nil:直接返回 返回值(读路径结束) 函数:调用 f(t, k) 都没有 → 返回 nil...

