Lua的控制结构原理分析

outputo-20210606-151644-686-ndin.png

Lua提供了一组传统的、小巧的控制结构,包括用于条件执行的if,用于迭代的while、repeat和for。所有的控制结构都有意个显式的终止符:if、for和while以end作为结尾,repeat以until作为结尾。

1. if then else


if a < 0 then a = 0 end


if a < b then return a else return b end


if line > MAXLINES then

    showpage()

    line = 0

end

若要编写嵌套的if,可以使用elseif。


if op == "+" then

    r = a + b

elseif op == "-" then

    r = a - b

elseif op == "*" then

    r = a * b

elseif op == "/" then

    r = a / b

else

    error("invalid operation")

end

由于Lua不支持switch语句,所以这种一连串的if-else if代码很常见。


2. while

Lua先测试while的条件。如果条件为假,那么循环结束;不然,Lua执行循环体,并重复这一过程。


local i = 1

while a[i] do

    print(a[i])

    i = i + 1

end

3. repeat

一条repeat-until语句重复执行其循环体直到条件为真时结束。测试是在循环体之后做的,因此循环体至少会执行一次。


-- 打印输入的第一行不为空的内容

repeat

    line = io.read()

until line ~= ""

print (line)

与其他大多数语言不同的是,在Lua中,一个声明在循环体中的局部变量的作用于包括了条件测试:


local sqr = x/2

repeat

    sqr = (sqr + x/sqr)/2

    local error = math.abs(sqr^2 - x)

until error < x/10000       -- 在此仍可访问error

4. 数字型for(numeric for)

for循环有两种形式:数字型for(numeric for)和泛型for(generic for)。

数字型for的语法如下:


for var=exp1,exp2,exp3 do

    <执行体>

end

var从exp1变化到exp2,每次变化都以exp3作为步长(step)递增var,并执行一次“执行体”。第三个表达式exp3是可选的,若不指定的话,Lua会将步长默认为1。以下是这种循环的一个典型示例:


for i=1,f(x) do print(i) end

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

如果不想给循环设置上限的话,可以使用常量math.huge:


for i=1,math.huge do

    if (0.3*i^3 - 20*i^2 - 500 >= 0) then

        print(i)

        break

    end

end

5.泛型for(generic for)

泛型for循环通过一个迭代器(iterator)函数来遍历所有值:

分享: