新聞中心
Lua 是一種輕量小巧的腳本語(yǔ)言,用標(biāo)準(zhǔn)C語(yǔ)言編寫(xiě)并以源代碼形式開(kāi)放, 其設(shè)計(jì)目的是為了嵌入應(yīng)用程序中,從而為應(yīng)用程序提供靈活的擴(kuò)展和定制功能。

10年積累的網(wǎng)站建設(shè)、網(wǎng)站制作經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有海珠免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
三目運(yùn)算
熟悉 C/C++ 的老司機(jī)都知道三目運(yùn)算 a ? b : c,這種寫(xiě)法替換簡(jiǎn)單的條件判斷語(yǔ)句可以在不增加閱讀難度的情況下,使代碼盡量保持簡(jiǎn)潔。
int a, b, ret;
//if-else
if (a > b)
ret = a;
else
ret = b;
//三目運(yùn)算符
ret = a > b ? a : b;
Lua 中的三目運(yùn)算
Lua 原生的語(yǔ)義并沒(méi)有實(shí)現(xiàn)三目運(yùn)算,一般是通過(guò)邏輯運(yùn)算符 and 和 or 來(lái)模擬三目運(yùn)算符的。
Lua 中 and 和 or 都使用”短路求值(short_cur evaluation)”,也就是說(shuō),它們只會(huì)在需要時(shí)才去評(píng)估第二個(gè)操作數(shù)。(《Lua程序設(shè)計(jì)》)
local a, b, ret;
ret = a > b and a or b
窮舉所有可能性:
a > b 時(shí):
a > b and a –> true
a or b –> a
a
a > b and a –> false
a or b –> b
完美!
Lua 中的三目運(yùn)算符陷阱
按照從特殊到一般的原則:
-
三目運(yùn)算的一般形式a ? b : c
a = true,結(jié)果為b a = false,結(jié)果為c
-
對(duì)應(yīng)Lua中的a and b or c
-
-
a = true
-
a = false
-
a and b –> false
-
b or c –> c
-
a and b –> false
-
b or c –> c
-
a = true
-
a = false
-
a and b –> true
-
b or c –> b
-
a and b –> false
-
b or c –> c
-
b = true
-
b = false
-
可以看到當(dāng) b = false 時(shí),Lua模擬的 a and b or c 始終返回 c 并不能還原三目運(yùn)算符的原貌。
《Lua程序設(shè)計(jì)》也建議這種情況使用 if-else 來(lái)避免。
一般化的 a and b or c
那么有沒(méi)有辦法可以解決 b = false 失效的問(wèn)題呢?
由此我聯(lián)想到 C 語(yǔ)言有一道常規(guī)的考題:請(qǐng)使用宏定義寫(xiě)一個(gè)返回兩個(gè)值中較小值的方法。
在校時(shí)第一次看到本題,第一反應(yīng)如下:
#define MIN(A,B) A
然而這種寫(xiě)法在很多嵌套的使用環(huán)境中都不能返回正確的結(jié)果。比如:2 * MIN(3, 4)展開(kāi)為 2 * 3
#define MIN(A,B) ((A)
還有好奇心的同學(xué)可以參考:宏定義的正確寫(xiě)法,三目運(yùn)算的宏定義
從這個(gè)示例中,我就在想如何能保證 a and b or c 中 b 為真或者 b 不產(chǎn)生歧義呢?
-
and的運(yùn)算優(yōu)先級(jí)高于or,簡(jiǎn)單的改變運(yùn)算順序并沒(méi)有用。
-
這時(shí)就想到了lua中萬(wàn)能的table,能不能把a(bǔ),b,c都放到table中來(lái)改變b的存在呢?要注意{nil}也是一個(gè)為true的對(duì)象。 a,b,c都替換為table:{a} and or {c}。
-
三目運(yùn)算中a是條件,結(jié)果是b或者c。其實(shí)a并不需要放入table中,否則{a}就始終為true了,失去了條件的意義。而 or {c}的結(jié)果也必然是一個(gè)table,該table只有一個(gè)元素。那么通過(guò)[1]即可訪問(wèn)。
-
綜上所述,更一般化的Lua三目運(yùn)算為:(a and or {c})[1]
總結(jié)
誠(chéng)然,要想知道Lua中三目運(yùn)算的形式,只需通過(guò)搜索就可以找到想要的答案。上述的推理過(guò)程多少有點(diǎn)先知道答案,故意往答案上靠的嫌疑。不過(guò)我堅(jiān)信證明一個(gè)問(wèn)題,結(jié)論并不是最重要的,重要的是論證的過(guò)程。本文僅以我對(duì)Lua粗淺的認(rèn)知來(lái)嘗試還原一般化的Lua三目運(yùn)算的推導(dǎo)過(guò)程,如有更好的推理過(guò)程,可以一起交流。
網(wǎng)頁(yè)標(biāo)題:詳解Lua中的三目運(yùn)算符
當(dāng)前地址:http://www.5511xx.com/article/djsddpe.html


咨詢
建站咨詢
