4

在一个不可触碰的程序的某个时刻,会完成两个 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)

但是,aandb具有不同的类型,并且==运算符返回false甚至没有达到我的__eq重载。

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

4

1 回答 1

3

覆盖__eq在 Lua 5.2 下适用于不同类型的对象;但是,只要两个元表都指向同一个函数,它在 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元方法分别覆盖 > 和 >=。

于 2012-10-19T14:18:03.963 回答