4

除了==and <,Lua 还有<=操作码和元方法(OP_LE, TM_LE)。

文档说

在没有“le”元方法的情况下,Lua 会尝试“lt”,假设 a <= b 等价于 not (b < a)

但为什么首先有'<='?为什么不能总是使用not (b < a)for a <= b

更新:

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

4

2 回答 2

7

让我们实现sets。使用顺序运算符进行包含测试真的很巧妙。a < b将意味着“a是”的适当子集ba = 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 做出假设的原因,即它总是可以根据其他运算符实现这三个运算符。

于 2013-04-28T12:24:25.827 回答
3

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
于 2013-04-29T12:21:43.497 回答