比较不同类型的值。

某些无法触及的程序的某个地方会比较两个 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)。现在问题是 ab 在不同的上下文中,所以我不能这样做:

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)

但是,ab 是不同类型的,== 运算符会直接返回 false 而不会触发我的 __eq 重载。

有没有想法如何达到我需要的效果?

点赞
用户1516484
用户1516484

在 Lua 5.2 下,重写 __eq 可以正常处理不同类型的对象;然而,在 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-19 14:18:03