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

Aby*_*byx 4 comparison lua operator-overloading

除了==<,Lua还有<=操作码和metamethod(OP_LE,TM_LE).

文档说

在没有"le"元方法的情况下,Lua尝试"lt",假设<= b等于不是(b <a)

但为什么首先有'<='?为什么它不能一直not (b < a)用于a <= b

更新:

如果它的所有有关的DSL,"语言钩",等等,那么为什么Lua中没有~=,>>=操作码和元方法?

Mar*_*der 7

让我们实现集合.使用订单运算符进行包含测试真的很简洁.a < b意味着" a是一个适当的子集b".a = bmena" ab平等".a <= b意味着" a是一个子集b"(不一定是合适的一个,所以它们可能是相等的).

现在考虑

a = Set:new{1, 2, 3}
b = Set:new{"a", "b", "c"}
Run Code Online (Sandbox Code Playgroud)

现在既不是a <= b也不a < b是真的.这是为什么?因为子集关系仅定义了部分顺序.a <= b相当于逻辑假设not(a > b)仅对定义总订单的完全关系有效.

(示例受"Lua编程,第3版"第131页启发)

编辑:

解决您的更新.为什么没有为lua元方法~=,>>=与问候到DSL实现?

即使在部分有序的集合上,以下也始终如此:

a > b    <==>   b < a
a >= b   <==>   b <= a
a ~= b   <==>   not (b == a)
Run Code Online (Sandbox Code Playgroud)

定义为不同的含义<>(除切换顺序)将让你的代码真的混乱,你不觉得吗?同样的事情,如果两个a,b可以是相等和不相等(或两者都不).我想,这就是为什么Lua做出这样的假设,它总是可以用其他运算符来实现这三个运算符.