Lua中的真值和假值

除了nil和false为假, 其它都为真.

这意味着包括0, 空字符串, 空表都为真.

源码中关于布尔值的代码

#define l_isfalse(o)    (ttisnil(o) || (ttisboolean(o) && bvalue(o) == 0))

说明:

  • ttisnil(o) : 判断对象o是否为nil值
  • ttisboolean(o) : 判断对象的tag是否为 LUA_TBOOLEAN
  • bvalue(o) : 判断对象的联合体 value_ 中的变量b是否为0

布尔值的应用

传参时的「nil」和「false」的�

Lua中经常给参数设置默认值的代码是 input = input or value, 当input为空时, 我们赋予它默认值value. 但是这个并不适用于布尔值.

如果我们的参数类型为false时, 执行input = input or value之后它被改成默认值, 所以input被改成了true!

逻辑运算符

Lua中的逻辑运算符是 and, or, not, 其中逻辑运算规则下

A and B -- 如果A为false,则返回A,否则返回B
A or B -- 如果A为true,则返回A,否则返回B

三元运算符

Lua中并没有三元运算符, 但是利用运算 ret = A and B or C 可以实现其效果.

但是需要注意的是, 如果B为false, 则ret永远为C, 达不到”当A为真时, ret为B; 否则为C”的效果, 因为A and false 永远为false, false or C永远为C

式子ret = A and true or false可以用在判断A是否存在(即为nil)