Lua 中的三目运算符介绍(三目运算符规则)

yumo6662周前 (07-20)技术文章10

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

三目运算

熟悉 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 <= b时:

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

完美!

Lua 中的三目运算符陷阱

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

  • 三目运算的一般形式a ? b : ca = true,结果为b
    a = false,结果为c
  • 对应Lua中的a and b or cb = truea = truea and b –> trueb or c –> ba = falsea and b –> falseb or c –> cb = falsea = truea and b –> falseb or c –> ca = falsea and b –> falseb 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 < 4 ? 3 : 4 = 6 < 4 ? 3 : 4,结果为4。 更"工程师"的写法是:

#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三目运算的推导过程,如有更好的推理过程,可以一起交流。

Lua 中的三目运算符介绍 | 《Linux就该这么学》 (linuxprobe.com)

相关文章

学习永远不晚 C语言试题及答案(学习永远不晚 C语言试题及答案2020)

、单项选择题(本大题共20题,每题2 分,共40分)1、以下不是C语言的特点的是 ( B )A、 C语言简洁、紧凑B、 能够编制出功能复杂的程序C、 C语言可以直接对硬件进行操作D、 C语言移植性好2...

2020年计算机二级《Access数据库程序设计》模拟题——勤笃学习网

2020年计算机二级《Access数据库程序设计》模拟题(4) 1.下面不是窗体“数据”属性的是( )。 A.排序依据 B.允许添加 C.记录源 D.自动居中 【答案】D 【解析】自...

怎么成为一个优秀的程序员,而不是一个优秀的码农?

优秀的程序员会告诉你打根基的重要性,会劝你在厚积薄发前要隐忍。优秀的码农会告诉你学啥底层、啥啥啥一拖就好了,学了python还要啥自行车啊,数据结构排序函数二分搜索这不都内置了吗?工作中永远用不到,学...

小说:这女人的舔狗谁爱当谁当!(舔狗形容女的怎么说)

萧启强将烟藏在了书包中,这个可不能让班主任钱爱军发现,否则必然会被没收。他一手拎包,一手拿着水朝着图书大厦一楼角落方向的班主任走去。“老班耽误你下班了哈,诺,请你喝水哈。”钱爱军丝毫也不见外,拧开盖子...

AI时代,破除&quot;文科无用论&quot;的认知迷雾

2025年全国高考填报在际,又有所谓的“专家”出来大肆宣扬:当 AI 能够生成新闻稿、分析文本情感、甚至撰写小说时,“文科无用论” 的声音悄然兴起。也有人认为,在技术主导的未来,哲学、历史、文学等文科...