阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Lua 中的三目运算符介绍

89次阅读
没有评论

共计 1398 个字符,预计需要花费 4 分钟才能阅读完成。

导读 Lua 原生的语义并没有实现三目运算,一般是通过逻辑运算符 and 和 or 来模拟三目运算符的。

Lua 中的三目运算符介绍

三目运算

熟悉 C/C++ 的老司机都知道三目运算 a ? b : c,这种写法替换简单的条件判断语句可以在不增加阅读难度的情况下,使代码尽量保持简洁。

int a, b, ret;
//if-else
if (a > b)
    ret = a;
else
    ret = b;

// 三目运算符
ret = a > b ? a : b;
Lua 中的三目运算

Lua 原生的语义并没有实现三目运算,一般是通过逻辑运算符 and 和 or 来模拟三目运算符的。

Lua 中 and 和 or 都使用 ” 短路求值(short_cur evaluation)”,也就是说,它们只会在需要时才去评估第二个操作数。(《Lua 程序设计》)

local a, b, ret;
ret = a > b and a or b

穷举所有可能性:

a > b 时:

a > b and a –> true 
a or b –> a

a a > b and a –> false
a or b –> b

完美!

Lua 中的三目运算符陷阱

按照从特殊到一般的原则:

  • 三目运算的一般形式 a ? b : c

    a = true, 结果为 b
    a = false, 结果为 c

  • 对应 Lua 中的 a and b or c

    • b = true
      • a = true
        • a and b –> true
        • b or c –> b
      • a = false
        • a and b –> false
        • b or c –> c
    • b = false
      • a = true
        • a and b –> false
        • b or c –> c
      • a = false
        • a and b –> false
        • b or c –> c

可以看到当 b = false 时,Lua 模拟的 a and b or c 始终返回 c 并不能还原三目运算符的原貌。

《Lua 程序设计》也建议这种情况使用 if-else 来避免。

一般化的 a and b or c

那么有没有办法可以解决 b = false 失效的问题呢?

由此我联想到 C 语言有一道常规的考题:请使用宏定义写一个返回两个值中较小值的方法。

在校时第一次看到本题,第一反应如下:

#define MIN(A,B) A < B ? A : B

然而这种写法在很多嵌套的使用环境中都不能返回正确的结果。比如:2 * MIN(3, 4)展开为 2 * 3 #define MIN(A,B) ((A) < (B) ? (A) : (B))

还有好奇心的同学可以参考:宏定义的正确写法,三目运算的宏定义

从这个示例中,我就在想如何能保证 a and b or c 中 b 为真或者 b 不产生歧义呢?

  1. and 的运算优先级高于 or,简单的改变运算顺序并没有用。
  2. 这时就想到了 lua 中万能的 table,能不能把 a,b,c 都放到 table 中来改变 b 的存在呢?要注意 {nil} 也是一个为 true 的对象。
    a,b,c 都替换为 table:{a} and {b} or {c}。
  3. 三目运算中 a 是条件,结果是 b 或者 c。其实 a 并不需要放入 table 中,否则 {a} 就始终为 true 了,失去了条件的意义。而{b} or
    {c}的结果也必然是一个 table,该 table 只有一个元素。那么通过 [1] 即可访问。
  4. 综上所述,更一般化的 Lua 三目运算为:(a and {b} or {c})[1]
总结

诚然,要想知道 Lua 中三目运算的形式,只需通过搜索就可以找到想要的答案。上述的推理过程多少有点先知道答案,故意往答案上靠的嫌疑。不过我坚信证明一个问题,结论并不是最重要的,重要的是论证的过程。本文仅以我对 Lua 粗浅的认知来尝试还原一般化的 Lua 三目运算的推导过程,如有更好的推理过程,可以一起交流。

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-25发表,共计1398字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中