Lua决定使用重载的_add或_sub

时间:2012-12-14 01:45:46

标签: lua

我创建了一个元表,其中__add和__sub取一个表和一个数字。 Lua如何确定使用哪个?考虑以下两种情况,使用表T(使用metatable描述)

local n=-10
local V=T+n

local n=-10
local V=T-n

哪个被叫?

我已经尝试了各种组合,但没有看到模式。

2 个答案:

答案 0 :(得分:5)

  

创建了一个元表,其中__add和__sub取一个表和一个数字。

__ add和__sub采用两个操作数。其中一个必然是一个表或用户数据,它有你的metatable,另一个可以是任何东西。 Lua不关心其他操作数的类型。

如果任一操作数具有带特定运算符(+ - > __add- => __sub)的处理程序的元表,那么该处理程序将是调用。

在你的例子中,Lua不仅不关心n是正面还是负面,它不关心它是否是一个数字。 -中的-n__sub元方法无关 - 即一元减去运算符,而__sub处理二进制减去运算符。

  

Lua如何确定使用哪个?

+运算符是“__add”事件。当您说op1 + op2时,Lua会检查op1是否有使用__add处理程序的元表。如果找到一个,则调用它。否则,它会检查op2

答案 1 :(得分:3)

这是源代码中两个操作数运算符的符号,它是决定性的。

它不关心操作数值是负数还是正数。它甚至不关心你的n实际上是一个数字还是另一种类型的值。

local n=-10  
local V=T+n  -- __add called

local n=-10
local V=T-n  -- __sub called