为什么Lua有`< =`操作码和metamethod?

时间:2013-04-28 10:59:27

标签: lua comparison operator-overloading

除了==<之外,Lua还拥有<=操作码和元方法(OP_LETM_LE)。

文档说

  

在没有“le”元方法的情况下,Lua尝试“lt”,假设&lt; = b等于不是(b

但为什么首先有'&lt; ='?为什么不能not (b < a)始终使用a <= b

更新

如果全部是关于DSL,“语言钩子”等,那么为什么Lua没有~=>>=操作码和元方法?

2 个答案:

答案 0 :(得分:7)

让我们实施sets。使用订单运算符进行包含测试真的很简洁。 a < b表示&#34; ab&#34;的正确子集。 a = b表示&#34; ab相等&#34;。 a <= b表示&#34; ab&#34;的一部分(不一定是合适的,所以它们可能是平等的。)

现在考虑

a = Set:new{1, 2, 3}
b = Set:new{"a", "b", "c"}

现在a <= ba < b都不是真的。这是为什么?因为子集关系仅定义partial ordera <= b等同于not(a > b)的逻辑假设仅对定义total order的完全关系有效。

(示例灵感来自&#34; Lua编程,第3版&#34;第131页)

修改

解决您的更新问题。为什么没有关于DSL实施的~=>>=的Lua元方法?

即使在部分有序集上,以下情况也是如此:

a > b    <==>   b < a
a >= b   <==>   b <= a
a ~= b   <==>   not (b == a)

<>定义不同的含义(切换顺序除外)会让您的代码真的令人困惑,您认为不是吗?同样的事情,如果两个ab可以是相等和不相等(或两者都不)。我想,这就是为什么Lua做出这样的假设,它总是可以用其他运算符来实现这三个运算符。

答案 1 :(得分:3)

not (b < a)a <= b不等同。

对于数字(即内置浮点类型),它们在NaN s存在时给出不同的结果:

a = 0/0
print(a) -- nan
print(a <= a) -- false
print(not(a < a)) -- true

如果您想要以相同的方式定义自己的BCD或复数类型,则需要同时使用两种元方法。仅通过定义<来获得相同的效果。

这不适用于a ~= b,其中 等同于not (a == b)

print(not(a == a)) -- true
print(a ~= a) -- true