Lua三元运算符中的坑

在很多的语言中通常表示三元运算符为 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 或者假,那么我们会发现如果有这么一个式子 5>4 and false or true 。这时候它就会返回true,但是如果用其他语言的三元运算符中应该返回的是false,这跟三元运算符想表达的结果完全不一样。
(a and b ) or c:当b为真时 ,当a为真,无论c为真或者假,它只会取b值,当a为假时,它只会取c的值

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值