Lua 循環:如何使用 while 和 repeat until
學習如何以及何時在 Lua 中使用 while 和 repeat until 循環。
控制結構是編程語言的一個重要特徵,因為它們使你能夠根據通常在程序運行時動態建立的條件來指導程序的流程。不同的語言提供了不同的控制,在 Lua 中,有 while
循環、for
循環和 repeat
until
循環。這篇文章涵蓋了 while
和 repeat until
循環。由於它們的靈活性,我在一篇 單獨的文章 中介紹 for
循環。
條件是由一個使用運算符的表達式來定義的,運算符是你在數學課上可能認識的符號的一個花哨的術語。Lua 中有效的運算符有:
==
等於~=
不等於<
小於>
大於⇐
小於或等於>=
大於或等於
這些被稱為關係運算符,因為它們比較兩個值之間的關聯。還有一些邏輯運算符,其含義與英語中的含義相同,可以納入條件中,進一步描述你想檢查的狀態:
and
or
下面是一些條件的例子:
foo > 3
:變數foo
是否大於 3?foo
必須是 4 或更大才能滿足這個條件。foo >= 3
:foo
是否大於或等於 3?foo
必須是 3 或更大才能滿足這個條件。foo > 3 and bar < 1
:foo
是否大於 3 而bar
小於 1?要滿足這個條件,foo
變數必須在bar
為 0 的同時為 4 或更大。foo> 3 or bar < 1
:foo
是否大於 3?或者,bar
是否小於 1?如果foo
是 4 或更大,或者bar
是 0,那麼這個條件就是真的。如果foo
是 4 或更大,而bar
是 0,會怎樣?答案出現在本文的後面。
While 循環
只要滿足某個條件,while 循環就會執行指令。例如,假設你正在開發一個應用來監測正在進行的殭屍末日。當沒有剩餘的殭屍時,就不再有殭屍末日了:
zombie = 1024
while (zombie > 0) do
print(zombie)
zombie = zombie-1
end
if zombie == 0 then
print("No more zombie apocalypse!")
end
運行代碼,看殭屍消失:
$ lua ./while.lua
1024
1023
[...]
3
2
1
No more zombie apocalypse!
until 循環
Lua 還有一個 repeat
until
循環結構,本質上是一個帶有 catch
語句的 while
循環。假設你在從事園藝工作,你想追蹤還剩下什麼可以收穫的東西:
mytable = { "tomato", "lettuce", "brains" }
bc = 3
repeat
print(mytable[bc])
bc = bc - 1
until( bc == 0 )
運行代碼:
$ lua ./until.lua
brains
lettuce
tomato
這很有幫助!
無限循環
一個無限循環有一個永遠無法滿足的條件,所以它無限地運行。這通常是一個由錯誤邏輯或你的程序中的意外狀態引起的錯誤。例如,在本文的開頭,我提出了一個邏輯難題。如果一個循環被設定為 foo > 3 or bar < 1
運行 ,那麼當 foo
為 4 或更大而 bar
為 0 時,會發生什麼?
下面是解決這個問題的代碼,為了以防萬一,還使用了 break
語句安全捕獲:
foo = 9
bar = 0
while ( foo > 3 or bar < 1 ) do
print(foo)
foo = foo-1
-- safety catch
if foo < -800000 then
break
end
end
你可以安全地運行這段代碼,但它確實模仿了一個意外的無限循環。有缺陷的邏輯是 or
運算符,它允許這個循環在 foo
大於 3 和 bar
小於 1 的情況下繼續進行。and
運算符有不同的效果,但我讓你去探索。
無限循環實際上有其用途。圖形應用使用技術上的無限循環來保持應用程序窗口的開放。我們沒有辦法知道用戶打算使用這個程序多久,所以程序無限地運行,直到用戶選擇退出。在這些情況下使用的簡單條件顯然是一個總是被滿足的條件。下面是一個無限循環的例子,為了方便起見,還是內置了一個安全陷阱:
n = 0
while true do
print(n)
n = n+1
if n > 100 then
break
end
end
條件 while true
總是被滿足,因為 true
總是為真。這是比寫 while 1 == 1
或類似的永遠為真的簡潔方式。
Lua 中的循環
從示例代碼中可以看出,儘管有不同的實現方式,但循環基本上都是朝著同一個目標工作。選擇一個對你來說有意義的,並且在你需要執行的處理過程中效果最好的。以防萬一你需要它:終止失控循環的鍵盤快捷鍵是 Ctrl+C
。
via: https://opensource.com/article/23/2/lua-loops-while-repeat-until
作者:Seth Kenlon 選題:lkxed 譯者:geekpi 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive