Lua 循環:如何使用 while 和 repeat until

硬核老王 發佈 2024-05-06T17:42:23.502660+00:00

學習如何以及何時在 Lua 中使用 while 和 repeat until 循環。控制結構是程式語言的一個重要特徵,因為它們使你能夠根據通常在程序運行時動態建立的條件來指導程序的流程。

學習如何以及何時在 Lua 中使用 while 和 repeat until 循環。

控制結構是程式語言的一個重要特徵,因為它們使你能夠根據通常在程序運行時動態建立的條件來指導程序的流程。不同的語言提供了不同的控制,在 Lua 中,有 while循環、for循環和repeatuntil循環。這篇文章涵蓋了whilerepeat until循環。由於它們的靈活性,我在一篇單獨的文章中介紹for循環。

條件是由一個使用運算符的表達式來定義的,運算符是你在數學課上可能認識的符號的一個花哨的術語。Lua 中有效的運算符有:

  • ==等於
  • ~=不等於
  • 小於
  • >大於
  • 小於或等於
  • >=大於或等於

這些被稱為關係運算符,因為它們比較兩個值之間的關聯。還有一些邏輯運算符,其含義與英語中的含義相同,可以納入條件中,進一步描述你想檢查的狀態:

  • and
  • or

下面是一些條件的例子:

  • foo > 3:變量foo是否大於 3?foo必須是 4 或更大才能滿足這個條件。
  • foo >= 3foo是否大於或等於 3?foo必須是 3 或更大才能滿足這個條件。
  • foo > 3 and bar :foo是否大於 3 而bar小於 1?要滿足這個條件,foo變量必須在bar為 0 的同時為 4 或更大。
  • foo> 3 or bar :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 還有一個 repeatuntil循環結構,本質上是一個帶有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 運行 ,那麼當 foo為 4 或更大而bar為 0 時,會發生什麼?

下面是解決這個問題的代碼,為了以防萬一,還使用了 break語句安全捕獲:

foo = 9
bar = 0

while ( foo > 3 or bar 

你可以安全地運行這段代碼,但它確實模仿了一個意外的無限循環。有缺陷的邏輯是 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

本文由 LCTT原創編譯,Linux中國榮譽推出

關鍵字: