布尔类型

布尔和其他值

处理 lua 时,区分布尔值 truefalse 以及求值为 true 或 false 的值非常重要。

在 lua 中只有两个值被评估为 false:nilfalse,而其他一切,包括数字 0 评估为 true。

这意味着什么的一些例子:

if 0 then print("0 is true") end --> this will print "true"
if (2 == 3) then print("true") else print("false") end --> this prints "false"
if (2 == 3) == false then print("true") end --> this prints "true"
if (2 == 3) == nil then else print("false") end
--> prints false, because even if nil and false both evaluate to false,
--> they are still different things.

逻辑运算

lua 中的逻辑运算符不一定返回布尔值:

如果第一个值的计算结果为 true,则 and 将返回第二个值;

如果第一个值的计算结果为 false,则 or 返回第二个值;

这使得模拟三元运算符成为可能,就像在其他语言中一样:

local var = false and 20 or 30 --> returns 30
local var = true and 20 or 30 --> returns 20
-- in C: false ? 20 : 30

如果表不存在,也可以用它来初始化表

tab = tab or {} -- if tab already exists, nothing happens

或者避免使用 if 语句,使代码更容易阅读

print(debug and "there has been an error") -- prints "false" line if debug is false
debug and print("there has been an error") -- does nothing if debug is false
-- as you can see, the second way is preferable, because it does not output
-- anything if the condition is not met, but it is still possible.
-- also, note that the second expression returns false if debug is false,
-- and whatever print() returns if debug is true (in this case, print returns nil)

检查变量是否已定义

还可以轻松检查变量是否存在(如果已定义),因为不存在的变量返回 nil,其计算结果为 false。

local tab_1, tab_2 = {}
if tab_1 then print("table 1 exists") end --> prints "table 1 exists"
if tab_2 then print("table 2 exists") end --> prints nothing

唯一不适用的情况是变量存储值 false,在这种情况下它在技术上存在但仍然计算为 false。因此,根据状态或输入创建返回 falsenil 的函数是一个糟糕的设计。我们仍然可以检查我们是否有 nilfalse

if nil == nil then print("A nil is present") else print("A nil is not present") end
if false == nil then print("A nil is present") else print("A nil is not present") end
-- The output of these calls are:
-- A nil is present!
-- A nil is not present