types – 比较不同类型的值
发布时间:2020-12-14 21:44:11 所属栏目:大数据 来源:网络整理
导读:在一个不可触及的程序的某个点上,完成了两个Lua值之间的比较: return a==b; 我需要把这个==变成 =,所以我来到下面的黑客: a = { value=5 }b = { value=2 }mt = { __eq = function (op1,op2) return op1.value = op2.value end}setmetatable(a,mt)setmetata
在一个不可触及的程序的某个点上,完成了两个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元方法覆盖>和> =分别. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |