Lua怎么重载运算符?

文章导读
Previous Quiz Next Lua table 默认情况下无法使用像 +, - , * 等算术运算符对其进行算术运算。但 metatables 提供了某些特殊的字段来重载算术运算符。
📋 目录
  1. 示例 - 在 table 上使用 + 运算符出错
  2. 示例 - 重载 + 运算符
A A

Lua - 操作符重载



Previous
Quiz
Next

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