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