除了==
和<
之外,Lua还拥有<=
操作码和元方法(OP_LE
,TM_LE
)。
文档说
但为什么首先有'&lt; ='?为什么不能not (b < a)
始终使用a <= b
?
更新
如果全部是关于DSL,“语言钩子”等,那么为什么Lua没有~=
,>
和>=
操作码和元方法?
答案 0 :(得分:7)
让我们实施sets。使用订单运算符进行包含测试真的很简洁。 a < b
表示&#34; a
是b
&#34;的正确子集。 a = b
表示&#34; a
和b
相等&#34;。 a <= b
表示&#34; a
是b
&#34;的一部分(不一定是合适的,所以它们可能是平等的。)
现在考虑
a = Set:new{1, 2, 3}
b = Set:new{"a", "b", "c"}
现在a <= b
和a < b
都不是真的。这是为什么?因为子集关系仅定义partial order。 a <= 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)
为<
和>
定义不同的含义(切换顺序除外)会让您的代码真的令人困惑,您认为不是吗?同样的事情,如果两个a
和b
可以是相等和不相等(或两者都不)。我想,这就是为什么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