除了==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不等价。
对于数字(即内置浮点类型),它们在存在NaNs 时给出不同的结果:
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