如何比较不同类型的数据值?

2026-04-01 19:471阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计348个文字,预计阅读时间需要2分钟。

如何比较不同类型的数据值?

在一个不可预知的程序某个点上,完成了两个Lua值之间的比较:`return a==b;` 我需要将这个`==`变成`=`, 所以在下面的黑盒中:

luaa={value=5}b={value=2}mt={__eq=function(op1, op2) return op1.val end}

在一个不可触及的程序的某个点上,完成了两个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) 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重载.

关于如何实现我需要的任何想法?

在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元方法覆盖>和> =分别.

标签:不可

本文共计348个文字,预计阅读时间需要2分钟。

如何比较不同类型的数据值?

在一个不可预知的程序某个点上,完成了两个Lua值之间的比较:`return a==b;` 我需要将这个`==`变成`=`, 所以在下面的黑盒中:

luaa={value=5}b={value=2}mt={__eq=function(op1, op2) return op1.val end}

在一个不可触及的程序的某个点上,完成了两个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) 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重载.

关于如何实现我需要的任何想法?

在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元方法覆盖>和> =分别.

标签:不可