1.软文推荐

2.软文推荐

3.软文推荐

Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

三目运算

熟悉 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

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

可以看到当 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 

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

#define MIN(A,B) ((A) 

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

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

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

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

本文来源:www.lxlinux.net/9329.html,若引用不当,请联系修改。

相关文章 8

1

linux时间修改命令(linux时间修改命令不允许) 3分钟前

目录:1、linux修改系统时间命令2、linux修改时间命令setdate(linux修改时间命令没权限)3、LINUX系统如何修改时间命令?linux修改系统时间命令...

2

详解Python注释 5分钟前

写代码注释是一件很重要的事情,如果你写的一段函数给别人调用那么往往都需要配上一些基本的注释。写好代码可以让别人容易阅读你的...

3

seo排名优化周到易速达(快速seo整站优化排行) 8分钟前

目录:1、SEO快速排名优化方法2、seo网站排名优化有什么方法3、seo网站排名优化有什么方法?4、排名seo优化5、SEO快速排名的最新方法?6、...

4

Linux tcpdump命令使用实例 10分钟前

tcpdump就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump可以将网络中传送的数据包的头完全...

5

防范远程桌面协议(RDP)的安全威胁具体方法 13分钟前

由于RDP是一种非常流行的协议,攻击者一旦获取访问权限,就会使用其转移到其他系统,所以,RDP也成功吸引了攻击者的目光。 远程桌面协...

6

网站优化品牌sz蓝博的简单介绍 15分钟前

目录:1、如何做好网站优化的方法2、网站seo优化应该怎么做呢?3、如何选择网站优化公司4、SEO网站优化的方法 SEO网站优化的方法有哪些...

7

探讨 Linux CPU 的上下文切换 17分钟前

我们都知道 Linux 是一个多任务操作系统,它支持的任务同时运行的数量远远大于 CPU 的数量。当然,这些任务实际上并不是同时运行的(S...

8

电脑硬盘脱机状态(电脑硬盘脱机状态怎么解除) 18分钟前

目录:1、硬盘显示脱机2、请问计算机硬盘脱机怎么办啊?3、磁盘脱机是什么意思4、电脑硬盘脱机怎么办啊?急急急急.........5、(该硬盘处...