【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
順序 選擇 循環 總結