Lua 中的 table 由于定义的行为,我们可以对 key-value 对执行加操作,访问 key 对应的 value,遍历所有的 key-value。但是我们不可以对两个 table 执行加操作,也不可以比较两个表的大小。
Metatables 允许我们改变 table 的行为,例如,使用 Metatables 我们可以定义 Lua 如何计算两个 table 的相加操作 a+b。当 Lua 试图对两个表进行相加时,他会检查两个表是否有一个表有 Metatable,并且检查 Metatable 是否有__add 域。如果找到则调用这个__add函数(所谓的 Metamethod)去计算结果。
Lua 中的每一个表都有其 Metatable。(后面我们将看到 userdata 也有 Metatable), Lua默认创建一个不带 metatable 的新表。 可以使用
setmetatable 函数设置或者改变一个表的 metatable。
任何一个表都可以是其他一个表的 metatable,一组相关的表可以共享一个 metatable(描述他们共同的行为)。一个表也可以是自身的 metatable(描述其私有行为)。
