为什么Lua有`<=`指令码和元方法?

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

文档说

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

但是为什么会有 <=?为什么在 a <= b 中它不能总是使用 not (b < a)

更新:

如果这都是关于 DSL、 "language hooks" 等的问题,为什么 Lua 没有 ~=, >, 和 >= 操作码和元方法?

点赞
用户1633117
用户1633117

让我们来实现 集合。使用包含测试来使用顺序运算符将是非常好的。 a < b 的意思是“ ab 的真子集”, a = b 的意思是“ ab 相等”,a <= b的意思是“ ab 的子集”(不一定是真子集,所以他们可能相等)。

现在考虑以下内容

a = Set:new{1, 2, 3}
b = Set:new{"a", "b", "c"}

现在既不是 a <= b 也不是 a < b。为什么呢?因为子集关系只定义了一个偏序。逻辑假设 a <= b 等同于 not(a > b) 只对完全关系定义了全序有效。

(以“Lua 编程(第三版)”p. 131 为例的启示)

编辑:

回答您的更新更新。为什么 Lua 的元方法不与 DSL 实现有关的 ~=, >>=

即使是部分有序的集合,以下语句总是成立:

a > b    <==>   b < a
a >= b   <==>   b <= a
a ~= b   <==>   not (b == a)

定义 <> 的不同含义(除了交换顺序)将使您的代码变得非常混乱,不是吗?如果两个 ab 可以既相等又不相等(或两者都不是),那么也是相同的事情。我猜,这就是为什么 Lua 做出了假设,即它可以始终以其他运算符实现这三个运算符的假设。

2013-04-28 12:24:25
用户12048
用户12048

not (b < a)a <= b在数值(即内置浮点类型)存在NaN时,结果是不同的:

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-29 12:21:43