布林型別
布林和其他值
處理 lua 時,區分佈爾值 true
和 false
以及求值為 true 或 false 的值非常重要。
在 lua 中只有兩個值被評估為 false:nil
和 false
,而其他一切,包括數字 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。因此,根據狀態或輸入建立返回 false
和 nil
的函式是一個糟糕的設計。我們仍然可以檢查我們是否有 nil
或 false
:
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