在一个不可触及的程序的某个点上,完成了两个Lua值之间的比较: return a==b; 我需要把这个==变成 =,所以我来到下面的黑客: a = { value=5 }b = { value=2 }mt = { __eq = function (op1, op2) return op1.val
          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元方法覆盖>和> =分别.
