在這兩種語言中,運算式a and b的傳回值不是true或false,而是a/b當中非真的值,而表示a or b返回的是a/b當中為真的那個。
因此,要想類比C/C++中的三元操作符c ? a : b,簡單的用c and a or b是不行的,因為當c為真,而a為假時,返回的是b而不是a,這不符合三元操作符的定義。
以前學lua的時候,看lua之父的那本《lua程式設計》,他提到這個問題,但沒有說怎麼解決,而是推薦用普通的if/else代替,今天我在看《python核心編程》的時候,發現原來python社區早處理好了這個問題(當然,肯定lua社區早也處理好,我不知道罷了),這裡也在lua中測試一下方案。另外因為三元操作被來自C的程式員在python中大量使用,python後來也增加了專門的三元操作文法代替and-or的hack:a if c else b。
這是lua代碼:
1 a = nil
2 b = 1
3
4 exp = 1 < 2 and a or b
5 print(exp == a) --fales
6 exp = 1 > 2 and a or b
7 print(exp == b) --true
8
9 exp = (1 < 2 and {a} or {b})[1]
10 print(exp == a) --true
11 exp = (1 > 2 and {a} or {b})[1]
12 print(exp == b) --true
python代碼:
1 a = 0
2 b = 1
3
4 exp = 1 < 2 and a or b
5 print exp == a # 輸出False
6 exp = 1 > 2 and a or b
7 print exp == b # 輸出True
8
9 exp = (1 < 2 and [a] or [b])[0]
10 print exp == a # 輸出True
11 exp = (1 > 2 and [a] or [b])[0]
12 print exp == b # 輸出True
13
14 exp = a if 1 < 2 else b
15 print exp == a # 輸出True
16 exp = a if 1 > 2 else b
17 print exp == b # 輸出True
不過正確的方案書寫太過複雜,反而弄巧成拙。lua中沒有提供語言內建的支援,還是轉向正常的if/else吧。
當然,如果編碼者能夠斷言c and a or b中的a一定為真,那直接用這種寫法也不會錯,但這就是一個hack了,不值得推崇。