Lua 5.5 参考手册
__add:加法(+)操作。如果任何加法操作数不是数字,Lua 将尝试调用元方法。它首先检查第一个操作数(即使它是一个数字);如果该操作数没有为 __add 定义元方法,则 Lua 将检查第二个操作数。如果 Lua 能找到元方法,它将以两个操作数作为参数调用该元方法,并且调用的结果(调整为一个值)就是操作的结果。否则,如果未找到元方法,Lua 会引发错误。
__sub:减法(-)操作。行为类似于加法操作。
__mul:乘法(*)操作。行为类似于加法操作。
__div:除法(/)操作。行为类似于加法操作。
__mod:模数(%)操作。行为类似于加法操作。
__pow:幂(^)操作。行为类似于加法操作。
__unm:取反(一元 -)操作。行为类似于加法操作。
__idiv:整除(//)操作。行为类似于加法操作。
__band:按位与(&)操作。行为类似于加法操作,但如果任何操作数既不是整数也不是可强制转换为整数的浮点数,Lua 将尝试使用元方法(参见 §3.4.3)。
__bor:按位或(|)操作。行为类似于按位与操作。
__bxor:按位异或(二进制 ~)操作。行为类似于按位与操作。
__bnot:按位非(一元 ~)操作。行为类似于按位与操作。
__shl:按位左移(<<)操作。行为类似于按位与操作。
__shr:按位右移(>>)操作。行为类似于按位与操作。
__concat:连接(..)操作。行为类似于加法操作,但如果任何操作数既不是字符串也不是数字(总是可以强制转换为字符串),Lua 将尝试使用元方法。
__len:长度(#)操作。如果对象不是字符串,Lua 将尝试其元方法。如果存在元方法,Lua 将以对象作为参数调用它,并且调用的结果(总是调整为一个值)是操作的结果。如果没有元方法但对象是表,则 Lua 使用表长度操作(参见 §3.4.7)。否则,Lua 会引发错误。
__eq:相等(==)操作。行为类似于加法操作,但 Lua 仅在比较的值都是表或都是完整 userdata 且它们不原始相等时才尝试使用元方法。调用的结果总是转换为布尔值。
__lt:小于(<)操作。行为类似于加法操作,但 Lua 仅在比较的值既不是数字也不是字符串时才尝试使用元方法。此外,调用的结果总是转换为布尔值。
__le:小于等于(<=)操作。行为类似于小于操作。
__index:索引访问操作 table[key]。当 table 不是表或 key 不存在于 table 中时,会发生此事件。元值在 table 的元表中查找。此事件的元值可以是函数、表或任何具有 __index 元值的值。如果它是函数,则以 table 和 key 作为参数调用它,并且调用的结果(调整为一个值)就是操作的结果。否则,最终结果是使用 key 索引此元值的结果。此索引是常规的,不是原始的,因此可以触发另一个 __index 元值。
__newindex:索引赋值 table[key] = value。与索引事件一样,当 table 不是表或 key 不存在于 table 中时,会发生此事件。元值在 table 的元表中查找。与索引一样,此事件的元值可以是函数、表或任何具有 __newindex 元值的值。如果它是函数,则以 table、key 和 value 作为参数调用它。否则,Lua 将使用相同的键和值对该元值重复索引赋值。此赋值是常规的,不是原始的,因此可以触发另一个 __newindex 元值。
每当调用 __newindex 元值时,Lua 不会执行原始赋值。如果需要,元方法本身可以调用 rawset 来执行赋值。
__call:调用操作 func(args)。当 Lua 尝试调用非函数值(即 func 不是函数)时,会发生此事件。元方法在 func 中查找。如果存在,元方法将以 func 作为其第一个参数,后跟原始调用的参数(args)。调用的所有结果都是操作的结果。这是唯一允许返回多个结果的元方法。