Linux中國

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

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

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

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

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

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

  • and
  • or

下面是一些條件的例子:

  • foo > 3:變數 foo 是否大於 3?foo 必須是 4 或更大才能滿足這個條件。
  • foo >= 3foo 是否大於或等於 3?foo 必須是 3 或更大才能滿足這個條件。
  • foo > 3 and bar < 1foo 是否大於 3 而 bar 小於 1?要滿足這個條件,foo 變數必須在 bar 為 0 的同時為 4 或更大。
  • foo> 3 or bar < 1foo 是否大於 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

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


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國