Lua三元运算符中的坑

亡梦爱人 提交于 2020-01-15 01:46:20

在很多的语言中通常表示三元运算符为 a?b:c,但是lua中是没有三元运算符的。于是就有人想到用 a and b or c来模拟三元运算符,通常这样写的时候是不会有问题的,但是有种特殊情况他会出现意外。

了解这场意外,我们首先得了解lua中and 和 or 的机制。 lua语言中,把nil和false视为假,其他情况视为真。
在and中( a and b ):,当a为真时,lua会直接返回b的值,当a为假时,会直接返回a的值
在or中( a or b ) :,当 a为真时,会直接返回a的值,当a为假时,会直接返回b的值

print(nil and false)
print(true and 43)
print(12 and 43)
print(true or 43)
print(12 or 43)
print(nil or 43)
print(nil or false)

输出为
nil
43
43
true
12
43
false

看懂了上面的那些再回头看看lua中的"三元运算符",a and b or c 我们先把他改为 (a and b) or c,因此有下面几种情况

(a and b ) or c:当b为假时 ,无论a为真或者假,那么a and b 就为假,这时候值只能是 c 或者假,那么我们会发现如果有这么一个式子 3>4 and false or true 。这时候它就会返回true,显示3是不大于4的,这跟三元运算符想表达的结果完全不一样。
(a and b ) or c:当b为真时 ,当a为真,无论c为真或者假,它只会取b值,当a为假时,它只会取c的值

总之:如果想用 a and b or c的方式,那么我们b的值只能是真,不然还是乖乖的用 if-else吧。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!