lua 三目運算符


【1】lua語言中完整的三目運算符

 完整三目運算符形式:(a and {b} or {c})[1]

【2】分析原因

大部分C或C++程序員經常會用到三目運算符(三元運算符),形如 a ? b : c; 的邏輯,即a為真,表達式值為b,否則表達式值為c。

這樣的邏輯在寫lua的時候也常常需要用到,於是有人發明了形如 a and b or c 這種寫法,下面來先來分析一下這個表達式的問題:

Lua語言中的邏輯操作符有and、or和not。所有的邏輯操作符將 false 或 nil 視為假,而將除此之外的任何東西視為真。

對於操作符and來說,若它的第一個操作數為假,就返回第一個操作數;否則返回第二個操作數。(即a與b,見假則假)

對於操作符or來說,如果它的第一個操作數為真,就返回第一個操作數;否則返回第二個操作數。(即a或b,見真則真)

lua的經典書籍《Lua程序設計》中還有一段寫到:and和or都是用“短路求值”,也就是說,它們只會在需要時才會去判斷第二個操作數。

短路求值可以確保像(type(result) == "table" and result["msg"] == "OK")這樣的表達式不會導致運行錯誤。

“短路求值”可以保證在result不是table的情況,不會判斷result["msg"] == "OK"的值而直接返回false。

另外書中還提到“a and b or c”是一種類似於C語言中的表達式 a ? b : c 的習慣寫法,可是並未指出其中的問題。

但是,譯者在此注明了觀點,他指出如果要想讓a and b or c等價於a ? b : c,前提是b表達式必須為真,也就是說b不能等於false或者nil。

最后譯者給出了建議,那就是在無法確認b為真的情況下,最常用的辦法還是使用正常的if-else語句。

說到這里可能有些人開始反迷糊,為什么b表達式的值必須為真呢?

這個時候你可以寫個例子嘗試一下,如果b == false,那么無論a的表達式為真或者假,整體都會返回c的值。

那么怎樣才能保證b的值一直為真呢?實際的程序邏輯中是允許b為false或者nil的!

寫到這里也是為了記錄一下,好奇之余從其他人學到的技巧:

b表達式的外邊包裝一層table,寫成{b}的形式,返回時再寫成{b}[1]的形式就可以,那么整體的表達式就變成:(a and {b} or {c})[1]

這樣就滿足第二個表達式恆為真的前提,今后你可以在lua中愉快地寫三目運算符了!

【3】示例

(3.1)示例程序1

 1 local var_false = false
 2 
 3 local var_true = true
 4 
 5 -- 場景1:
 6 local a = 2
 7 local b = 1
 8 print('a > b and a or b : ' .. (a > b and a or b))
 9 print('a > b and false or b : ' .. (a > b and var_false or b))
10 --print('a > b and true or b : ' .. (a > b and var_true or b))  語法錯誤
11 print('(a > b and {a} or {b})[1] : ' .. (a > b and {a} or {b})[1])
12 print()
13 
14 -- 場景2:
15 a = 3
16 b = 3
17 print('a > b and a or b : ' .. (a > b and a or b))
18 print('a > b and false or b : ' .. (a > b and var_false or b))
19 print('a > b and true or b : ' .. (a > b and var_true or b))
20 print('(a > b and {a} or {b})[1] : ' .. (a > b and {a} or {b})[1])
21 print()
22 
23 -- 場景3:
24 a = 4
25 b = 5
26 print('a > b and a or b : ' .. (a > b and a or b))
27 print('a > b and false or b : ' .. (a > b and var_false or b))
28 print('a > b and true or b : ' .. (a > b and var_true or b))
29 print('(a > b and {a} or {b})[1] : ' .. (a > b and {a} or {b})[1])
30 print()
31 
32 -- 運行結果:
33 --[[
34 a > b and a or b : 2
35 a > b and false or b : 1
36 (a > b and {a} or {b})[1] : 2
37 
38 a > b and a or b : 3
39 a > b and false or b : 3
40 a > b and true or b : 3
41 (a > b and {a} or {b})[1] : 3
42 
43 a > b and a or b : 5
44 a > b and false or b : 5
45 a > b and true or b : 5
46 (a > b and {a} or {b})[1] : 5
47 --]]

(3.2)示例程序2

 1 local a = true
 2 local b = false
 3 -- 場景1:
 4 print((a and {"true"})[1])
 5 -- 場景2:語法錯誤
 6 --print((b and {"true"})[1]) error: attempt to index a boolean value
 7 -- 場景3:
 8 print("a value : " .. (a and {"true"} or {"false"})[1])
 9 print("b value : " .. (b and {"true"} or {"false"})[1])
10 
11 --[[ 運行結果:
12 true
13 a value : true
14 b value : false
15 --]]


Good Good Study Day Day Up

順序 選擇 循環 總結


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM