在一个不可触及的程序的某个点上,完成了两个Lua值之间的比较:
return a==b;
我需要把这个==变成> =,所以我来到下面的黑客:
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)
这给出了预期的结果(真实).现在,问题是a和b处于不同的上下文中,所以我无法做到:
setMetatable(a,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重载.
关于如何实现我需要的任何想法?
解决方法
在Lua 5.2下,覆盖__eq适用于不同类型的对象;但是,只要两个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元方法覆盖>和> =分别.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。