我创建了一个元表,其中__add和__sub取一个表和一个数字。 Lua如何确定使用哪个?考虑以下两种情况,使用表T(使用metatable描述)
local n=-10
local V=T+n
和
local n=-10
local V=T-n
哪个被叫?
我已经尝试了各种组合,但没有看到模式。
答案 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