Lua 程式設計教學:控制流程 (Control Structure)

PUBLISHED ON JAN 12, 2018 — PROGRAMMING

    預設情形下,程式由上往下依序執行;控制結構用於改變程式進行的順序,可分為兩類:

    • 選擇 (selection):僅執行符合條件的區塊
    • 迭代 (iteration):反覆執行某區塊

    本文介紹 Lua 可用的控制結構:

    if

    if 是選擇性執行特定區塊的方式,只有在符合條件時才會執行該區塊。以下為 if 虛擬碼:

    if condition 1 then
      -- code block 1
    elseif condition 2 then
      -- code block 2
    else
      -- code block 3
    end
    

    在以上虛擬碼中,共有三塊程式碼區塊,若符合 condition 1,則會進入 code block 1,執行完該區塊後就跳出整個 if 敘述;若不符合 condition 1,接著會判斷 condition 2,若符合,則執行 code block 2;若前述條件皆不符合,則執行 else 內的 code block 3。在 if 敘述中,elsif 區塊和 else 區塊皆為選擇性的,若不需要可省略。

    以下為實例:

    local a = 0
    
    if a > 0 then
      print("a is larger than zero")
    elseif a < 0 then
      print("a is smaller than zero")
    else
      print("a is equal to zero")
    end

    註:Lua 的 elseif 是單一保留字,在 else 及 if 間沒有空格。

    在本例中,若符合第一個區塊,Lua 會執行第一個區塊,之後就跳出整個 if 敘述,其他區塊亦同,所以本例僅執行最後一個區塊。

    while

    while 會反覆執行某區塊,直到條件不符時,才會跳出 while 敘述。while 寫成虛擬碼如下:

    while condition do
      -- some code block
    end
    

    以下是實例:

    local i = 1
    
    while i <= 10 do
      print(i)
      i = i + 1
    end

    以下是無限迴圈:

    while true do
      -- Do something here.
    end

    有時候無限迴圈是 bug,但也可能是刻意安排的。

    repeat

    repeat ... untilwhile 語義相反,反覆執行某區塊,直到某個條件成立為止。寫成虛擬碼如下:

    repeat
      -- some code block
    until condition

    以下是實例:

    local i = 1
    
    repeat
      print(i)
      i = i + 1
    until i > 10

    由於 repeatwhile 語義上可代換,但 repeat 的語義是負向的,故少用;通常是使用 while 敘述為主,僅在語義上剛好符合 repeat 時才會使用。

    for

    for 敘述有兩種,一種使用計數器 (counter),另一種使用迭代器 (iterator)。

    使用計數器

    for 適用於有特定次數的迭代。如以下實例:

    for i = 1, 10 do
      print(i)
    end

    本例會迭代 10 次,從 110

    不一定要以 1 計數,也可以用別的數字,實例如下:

    for i = 10, 1, -2 do
      print(i)
    end

    本例會迭代 5 次,從 102

    使用迭代器

    我們將於講解表 (table) 時一併介紹。

    break

    break 用於提早離開迴圈,實例如下:

    local i = 1
    
    while i <= 10 do
      if i > 5 then
        break
      end
      
      print(i)
      i = i + 1
    end

    return

    return 用於離開函式,我們將於講解函式時介紹。

    goto

    goto 僅在 Lua 5.2 版後才支援。

    使用 goto 搭配標籤可以任意跳躍位置,不過,會受到可視度 (scope) 的限制。通常使用 goto 是為了模擬別的語言的 continue,實例如下:

    for i = 1, 10 do
      if i % 2 ~= 0 then
        goto continue
      end
      
      print(i)
      
      ::continue::
    end

    如果使用 Lua 5.1 版,則要使用額外的旗標去模擬 continue,如以下實例:

    for i = 1, 10 do
      local flag = true
    
      if i % 2 ~= 0 then
        flag = false
      end
      
      if flag then
        print(i)
      end
    end
    comments powered by Disqus