在一个不可接触的程序的某个点上,完成了两个Lua值之间的比较:
return a==b;
我需要将此==
转换为>=
,所以我来到以下 hack :
a = { value=5 }
b = { value=2 }
mt = {
__eq = function (op1, op2)
return op1.value >= op2.value
end
}
setmetatable(a, mt)
setmetatable(b, mt)
print(a == b)
这给出了预期的结果(true
)。现在,问题是a
和b
处于不同的上下文中,所以我无法做到:
setmetatable(a, mt)
setmetatable(b, mt)
相反,我可以这样做:
mtA = {
__eq = function (op1, op2)
return op1.value >= op2.value
end
}
setmetatable(a, mtA)
mtB = {
__eq = function (op1, op2)
return op1.value >= op2.value
end
}
setmetatable(b, mtB)
但是,a
和b
属于不同的类型,==
运算符返回false
,甚至没有达到我的__eq
重载。
如何实现我的需求?
答案 0 :(得分:3)
覆盖__eq
在Lua 5.2下可以正常使用不同类型的对象;但是,只要两个metatable都指向相同的函数,它应该在5.1下正常工作,如下所示:
local a, b = { value=5 }, { value=2 }
local function meta_eq(op1, op2)
return op1.value >= op2.value
end
setmetatable(a, { __eq = meta_eq })
setmetatable(b, { __eq = meta_eq })
print(a == b) -- true
除了__eq
之外,还有值得注意的是,__gt
和__ge
元方法会覆盖>和> =分别。