推荐答案
在 Lua 中,__unm 元方法用于定义一元减号操作符(即取负操作)的行为。当对一个表或用户数据类型的值使用一元减号操作符时,Lua 会查找该值的 __unm 元方法。如果找到,Lua 会调用该元方法来执行取负操作。
本题详细解读
1. __unm 元方法的基本用法
__unm 元方法通常用于自定义类型的取负操作。例如,假设你有一个表示复数的表,你可以通过定义 __unm 元方法来实现复数的取负操作。
// www.javascriptcn.com code example
complex = {
real = 3,
imag = 4
}
complex_mt = {
__unm = function(c)
return {real = -c.real, imag = -c.imag}
end
}
setmetatable(complex, complex_mt)
neg_complex = -complex
print(neg_complex.real, neg_complex.imag) -- 输出: -3 -4在这个例子中,__unm 元方法被定义为一个函数,它接受一个复数表 c 并返回一个新的复数表,其实部和虚部都是原复数的相反数。
2. __unm 元方法的调用时机
当你对一个表或用户数据类型的值使用一元减号操作符时,Lua 会检查该值的元表中是否有 __unm 元方法。如果有,Lua 会调用该元方法,并将该值作为参数传递给元方法。
// www.javascriptcn.com code example
local t = {value = 10}
local mt = {
__unm = function(op)
return {value = -op.value}
end
}
setmetatable(t, mt)
local result = -t
print(result.value) -- 输出: -10在这个例子中,-t 触发了 __unm 元方法的调用,最终返回了一个新的表,其 value 字段是原表 value 字段的相反数。
3. __unm 元方法的注意事项
__unm元方法只能用于表或用户数据类型。对于 Lua 的基本类型(如数字、字符串等),Lua 已经内置了一元减号操作符的行为。- 如果元表中没有定义
__unm元方法,尝试对表或用户数据类型使用一元减号操作符会导致错误。
local t = {value = 10}
local result = -t -- 错误: 尝试对表进行一元减号操作,但未定义 __unm 元方法因此,在自定义类型中,如果你希望支持一元减号操作符,必须定义 __unm 元方法。