关系运算的元方法(Metamethods)

  • EQ 就是 EQUAL等于
  • NE就是 NOT EQUAL不等于
  • GT 就是 GREATER THAN大于 
  • LT 就是 LESS THAN小于
  • GE 就是 GREATER THAN OR EQUAL 大于等于
  • LE 就是 LESS THAN OR EQUAL 小于等于

Metatables 也允许我们使用 metamethods__eq(等于)__lt(小于),和__le(小于等于)给关系运算符赋予特殊的含义。对剩下的三个关系运算符没有专门的 metamethod,因为 Lua 将 a ~= b 转换为 not (a == b); a > b 转换为 b < a; a >= b 转换为 b <= a。

(直到 Lua 4.0 为止,所有的比较运算符被转换成一个, a <= b 转为 not (b < a)。然而这种转换并不一致正确。当我们遇到偏序(partial order)情况,也就是说,并不是所有的元素都可以正确的被排序情况。例如,在大多数机器上浮点数不能被排序,因为他的值不是一个数字(Not a Number 即 NaN)。根据 IEEE 754 的标准, NaN 表示一个未定义的值,比如 0/0 的结果。该标准指出任何涉及到 NaN 比较的结果都应为 false。也就是说, NaN <= x 总是 false, x < NaN 也总是 false。这样一来,在这种情况下 a <= b 转换为 not (b < a)就不再正确了。)

在我们关于基和操作的例子中,有类似的问题存在。 <=代表集合的包含: a <= b 表示集合 a 是集合 b 的子集。这种意义下,可能 a <= b 和 b < a 都是 false;因此,我们需要将__le 和__lt 的实现分开:最后,我们通过集合的包含来定义集合相等:
在这里插入图片描述
有了上面的定义之后,现在我们就可以来比较集合了:
在这里插入图片描述
结果如下:
在这里插入图片描述

与算术运算的 metamethods 不同,关系元算的 metamethods 不支持混合类型运算。对于混合类型比较运算的处理方法和 Lua 的公共行为类似。如果你试图比较一个字符串和一个数字, Lua 将抛出错误。相似的,如果你试图比较两个带有不同 metamethods 的对象, Lua 也将抛出错误。

但相等比较从来不会抛出错误,如果两个对象有不同的 metamethod,比较的结果为false,甚至可能不会调用 metamethod。这也是模仿了 Lua 的公共的行为,因为 Lua 总是认为字符串和数字是不等的,而不去判断它们的值。仅当两个有共同的 metamethod 的对象进行相等比较的时候, Lua 才会调用对应的 metamethod。

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

森明帮大于黑虎帮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值