Lua 循環(huán):如何使用 while 和 repeat until
控制結(jié)構(gòu)是編程語(yǔ)言的一個(gè)重要特征,因?yàn)樗鼈兪鼓隳軌蚋鶕?jù)通常在程序運(yùn)行時(shí)動(dòng)態(tài)建立的條件來(lái)指導(dǎo)程序的流程。不同的語(yǔ)言提供了不同的控制,在 Lua 中,有 ??while?
?? 循環(huán)、??for?
?? 循環(huán)和 ??repeat?
?? ??until?
?? 循環(huán)。這篇文章涵蓋了 ??while?
?? 和 ??repeat until?
?? 循環(huán)。由于它們的靈活性,我在一篇 ??單獨(dú)的文章??? 中介紹 ??for?
? 循環(huán)。
條件是由一個(gè)使用運(yùn)算符的表達(dá)式來(lái)定義的,運(yùn)算符是你在數(shù)學(xué)課上可能認(rèn)識(shí)的符號(hào)的一個(gè)花哨的術(shù)語(yǔ)。Lua 中有效的運(yùn)算符有:
- ?
?==?
? 等于 - ?
?~=?
?不等于 - ?
?<?
? 小于 - ?
?>?
? 大于 - ?
???
?小于或等于 - ?
?>=?
? 大于或等于
這些被稱為關(guān)系運(yùn)算符,因?yàn)樗鼈儽容^兩個(gè)值之間的關(guān)聯(lián)。還有一些邏輯運(yùn)算符,其含義與英語(yǔ)中的含義相同,可以納入條件中,進(jìn)一步描述你想檢查的狀態(tài):
- ?
?and?
? - ?
?or?
?
下面是一些條件的例子:
- ?
?foo > 3?
?:變量 ??foo?
? 是否大于 3???foo?
? 必須是 4 或更大才能滿足這個(gè)條件。 - ?
?foo >= 3?
?:??foo?
? 是否大于或等于 3???foo?
? 必須是 3 或更大才能滿足這個(gè)條件。 - ?
?foo > 3 and bar < 1?
?:??foo?
? 是否大于 3 而 ??bar?
? 小于 1?要滿足這個(gè)條件,??foo?
? 變量必須在 ??bar?
? 為 0 的同時(shí)為 4 或更大。 - ?
?foo> 3 or bar < 1?
?:??foo?
? 是否大于 3?或者,??bar?
? 是否小于 1?如果 ??foo?
? 是 4 或更大,或者 ??bar?
? 是 0,那么這個(gè)條件就是真的。如果 ??foo?
? 是 4 或更大,而 ??bar?
? 是 0,會(huì)怎樣?答案出現(xiàn)在本文的后面。
While 循環(huán)
只要滿足某個(gè)條件,while 循環(huán)就會(huì)執(zhí)行指令。例如,假設(shè)你正在開(kāi)發(fā)一個(gè)應(yīng)用來(lái)監(jiān)測(cè)正在進(jìn)行的僵尸末日。當(dāng)沒(méi)有剩余的僵尸時(shí),就不再有僵尸末日了:
運(yùn)行代碼,看僵尸消失:
until 循環(huán)
Lua 還有一個(gè) ??repeat?
? ??until?
? 循環(huán)結(jié)構(gòu),本質(zhì)上是一個(gè)帶有 ??catch?
? 語(yǔ)句的 ??while?
? 循環(huán)。假設(shè)你在從事園藝工作,你想追蹤還剩下什么可以收獲的東西:
運(yùn)行代碼:
這很有幫助!
無(wú)限循環(huán)
一個(gè)無(wú)限循環(huán)有一個(gè)永遠(yuǎn)無(wú)法滿足的條件,所以它無(wú)限地運(yùn)行。這通常是一個(gè)由錯(cuò)誤邏輯或你的程序中的意外狀態(tài)引起的錯(cuò)誤。例如,在本文的開(kāi)頭,我提出了一個(gè)邏輯難題。如果一個(gè)循環(huán)被設(shè)定為 ??foo > 3 or bar < 1?
? 運(yùn)行 ,那么當(dāng) ??foo?
? 為 4 或更大而 ??bar?
? 為 0 時(shí),會(huì)發(fā)生什么?
下面是解決這個(gè)問(wèn)題的代碼,為了以防萬(wàn)一,還使用了 ??break?
? 語(yǔ)句安全捕獲:
你可以安全地運(yùn)行這段代碼,但它確實(shí)模仿了一個(gè)意外的無(wú)限循環(huán)。有缺陷的邏輯是 ??or?
? 運(yùn)算符,它允許這個(gè)循環(huán)在 ??foo?
? 大于 3 和 ??bar?
? 小于 1 的情況下繼續(xù)進(jìn)行。??and?
? 運(yùn)算符有不同的效果,但我讓你去探索。
無(wú)限循環(huán)實(shí)際上有其用途。圖形應(yīng)用使用技術(shù)上的無(wú)限循環(huán)來(lái)保持應(yīng)用程序窗口的開(kāi)放。我們沒(méi)有辦法知道用戶打算使用這個(gè)程序多久,所以程序無(wú)限地運(yùn)行,直到用戶選擇退出。在這些情況下使用的簡(jiǎn)單條件顯然是一個(gè)總是被滿足的條件。下面是一個(gè)無(wú)限循環(huán)的例子,為了方便起見(jiàn),還是內(nèi)置了一個(gè)安全陷阱:
條件 ??while true?
? 總是被滿足,因?yàn)?nbsp;??true?
? 總是為真。這是比寫 ??while 1 == 1?
? 或類似的永遠(yuǎn)為真的簡(jiǎn)潔方式。
Lua 中的循環(huán)
從示例代碼中可以看出,盡管有不同的實(shí)現(xiàn)方式,但循環(huán)基本上都是朝著同一個(gè)目標(biāo)工作。選擇一個(gè)對(duì)你來(lái)說(shuō)有意義的,并且在你需要執(zhí)行的處理過(guò)程中效果最好的。以防萬(wàn)一你需要它:終止失控循環(huán)的鍵盤快捷鍵是 ??Ctrl+C?
?。