Lua - 操作符重载
Lua table 默认情况下无法使用像 +, - , * 等算术运算符对其进行算术运算。但 metatables 提供了某些特殊的字段来重载算术运算符。
__add 用于重载加法 (+) 运算符。
__sub 用于重载减法 (-) 运算符。
__mul 用于重载乘法 (*) 运算符。
__div 用于重载除法 (/) 运算符。
还有 __mod 用于取模,__pow 用于幂运算。这些 metamethods 允许定义 table 与算术运算符一起使用时的行为。这在处理自定义数据类型如 vectors、matrices 或复数时特别有用。
示例 - 在 table 上使用 + 运算符出错
如果 table 没有定义 __add metamethod,Lua 将报错,如以下示例所示 −
main.lua
-- table 1
local table1 = {}
-- table 2
local table2 = {}
-- 下面语句会抛出错误 - syntax error near '+'
table2 + table2
输出
运行上述程序时,将得到以下输出−
lua: main.lua:7: syntax error near '+'
示例 - 重载 + 运算符
在以下示例中,我们有一个更相关的例子,即将两个 vectors 相加。为了使用 + 运算符相加两个 vectors,我们实现了 __add metamethod,如下所示 −
main.lua
-- 为 Vector 创建 metatable
local Vector = {
-- 重载 + 运算符
__add = function(v1, v2)
return { x = v1.x + v2.x, y = v1.y + v2.y }
end
}
-- 创建 vector 实例的方法
function Vector.new(x, y)
return setmetatable({ x = x, y = y }, Vector)
end
-- 创建 vector 实例
local v1 = Vector.new(1, 2)
local v2 = Vector.new(3, 4)
-- 相加 vectors
local v3 = v1 + v2
-- 输出 4 6
print(v3.x, v3.y)
输出
运行上述程序时,将得到以下输出−
4 6