Lua 里只有两个值为假:false 和 nil。就这两个,其余全算真,包括 0、空字符串 ""、空表 {}、字符串 "false"。别把 PHP、JS 那套搬过来。
条件判断直接写 if x then,不用拿 true 或 false 去比。要区分 false 和 nil,必须显式写 x == nil 或 x == false,因为 if x then 会把这两种情况都当成假。
and 和 or 不返回布尔值,返回的是操作数本身。a and b:a 为假返回 a,否则返回 b。a or b:a 为真返回 a,否则返回 b。not 才永远返回 true 或 false。所以 local name = input or "匿名" 这种默认值写法成立,代价是 input 为 false 时也会被替换掉。
-- 只有 false 和 nil 为假
if 0 then print("0 是真") end -- 会打印
if "" then print("空串是真") end -- 会打印
if {} then print("空表是真") end -- 会打印
if "false" then print("字符串也是真") end -- 会打印
-- and / or 返回操作数本身
print(1 and 2) -- 2
print(nil and 2) -- nil
print(1 or 2) -- 1
print(nil or "默认") -- 默认
print(not 0) -- false,0 也是真
-- false 和 nil 要分开判断
local ok = false
local v = ok or true -- 得到 true,false 被当成假换掉了
if ok == false then print("确实是 false") end