【在主画面加入捷径】
       
【选择语系】
繁中 简中

Lua 程序设计教学:控制流程 (Control Structure)

【赞助商连结】

    默认情形下,程序由上往下依序执行;控制结构用于改变程序进行的顺序,可分为两类:

    • 选择 (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
    【赞助商连结】