除了==
and <
,Lua 还有<=
操作码和元方法(OP_LE
, TM_LE
)。
文档说
在没有“le”元方法的情况下,Lua 会尝试“lt”,假设 a <= b 等价于 not (b < a)
但为什么首先有'<='?为什么不能总是使用not (b < a)
for a <= b
?
更新:
如果都是关于 DSL、“语言钩子”等,那么为什么 Lua 没有~=
, >
, 和>=
操作码和元方法?
除了==
and <
,Lua 还有<=
操作码和元方法(OP_LE
, TM_LE
)。
文档说
在没有“le”元方法的情况下,Lua 会尝试“lt”,假设 a <= b 等价于 not (b < a)
但为什么首先有'<='?为什么不能总是使用not (b < a)
for a <= b
?
更新:
如果都是关于 DSL、“语言钩子”等,那么为什么 Lua 没有~=
, >
, 和>=
操作码和元方法?
让我们实现sets。使用顺序运算符进行包含测试真的很巧妙。a < b
将意味着“a
是”的适当子集b
。a = b
将mena“a
并且b
是平等的”。a <= b
将意味着“a
是”的子集b
(不一定是正确的,因此它们可能相等)。
现在考虑
a = Set:new{1, 2, 3}
b = Set:new{"a", "b", "c"}
现在既不是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)
<
为and定义不同的含义>
(除了切换顺序)会让你的代码非常混乱,你不觉得吗?如果两个a
并且b
可以同时相等和不相等(或两者都不相等),则相同。我想,这就是 Lua 做出假设的原因,即它总是可以根据其他运算符实现这三个运算符。
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