第一版是为 Lua 5.0 编写的。虽然在很大程度上仍然适用于更高版本,但仍有一些区别。
第四版针对 Lua 5.3,可在 Amazon 和其他书店购买。
购买本书,您还将帮助支持 Lua 项目


13 – 元表和元方法

通常,Lua 中的表具有一组可预测的操作。我们可以添加键值对,我们可以检查与键关联的值,我们可以遍历所有键值对,仅此而已。我们不能添加表,我们不能比较表,我们不能调用表。

元表允许我们更改表的行为。例如,使用元表,我们可以定义 Lua 如何计算表达式 a+b,其中 ab 是表。每当 Lua 尝试添加两个表时,它都会检查其中任何一个表是否具有元表,以及该元表是否具有 __add 字段。如果 Lua 找到此字段,它将调用相应的值(所谓的元方法,它应该是一个函数)来计算和。

Lua 中的每个表可能都有自己的元表。(正如我们稍后将看到的,用户数据也可以有元表。)Lua 总是创建没有元表的新表

    t = {}
    print(getmetatable(t))   --> nil
我们可以使用 setmetatable 来设置或更改任何表的元表
    t1 = {}
    setmetatable(t, t1)
    assert(getmetatable(t) == t1)
任何表都可以是任何其他表的元表;一组相关的表可以共享一个通用元表(描述它们的共同行为);一个表可以是它自己的元表(以便它描述它自己的个人行为)。任何配置都是有效的。