循环与选择
Lua提供以下类型的循环来处理循环需求。
编号 |
循环类型 |
描述 |
1 |
在给定条件为真时重复语句或语句组,它在执行循环体之前测试条件。 |
|
2 |
多次执行一系列语句,并缩写管理循环变量的代码。 |
|
3 |
重复语句组的操作,直到满足 |
|
4 |
可在任何循环中使用另一个或多个循环,如: |
循环控制声明
循环控制语句从正常顺序改变执行。 当执行离开作用域时,将销毁在该作用域中创建的所有自动对象。
Lua支持以下控制语句。
编号 |
控制语句 |
描述 |
1 |
终止循环并将执行转移到循环或switch之后的语句。 |
无限循环
如果条件永远不会变为假,则循环变为无限循环。 while
循环通常用于此目的。如果直接给出了一个条件为真,它就会永远执行。可以使用break
语句来打断这个无限循环。
while(true
)do
print("This loop will run forever.")end
Lua编程语言假定布尔true
和non-nil
值的任意组合为true
,如果它是布尔false
或nil
,则假定为false
值。 需要注意的是,在Lua中,零将被视为true
。
Lua编程语言提供以下类型的决策制定语句 -
编号 |
决策语句 |
描述 |
1 |
|
|
2 |
|
|
3 |
在一个 |
Lua中的控制结构
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 = 0end
若要编写嵌套的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/2repeat
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) endfor 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)函数来遍历所有值:
-- 打印数组a的所有值for i,v in ipairs(a) do print(v) end
Lua的基础库提供了ipairs,这时一个用于遍历数组的迭代其函数。在每次循环中,i会被赋予一个索引值,同时v被赋予一个对应于该索引的数组元素值。下面是另一个类似的示例,演示了如何遍历一个table中所有的key:
-- 打印table t中所有的keyfor k in pairs(t) do print(k) end
标准库提供了几种迭代器,包括:
用于迭代文件中每行的(io.lines);
迭代table元素的(pairs);
迭代数组元素的(ipairs);
迭代字符串中单词的(string.gmatch)等
Lua 编程语言中 for 循环语句可以重复执行指定语句,重复次数可在 for 语句中控制。
Lua 编程语言中 for语句有两大类:数值for循环, 泛型for循环
数值for循环
for var=exp1,exp2,exp3 do
<执行体>
end
var从exp1变化到exp2,每次变化以exp3为步长递增var,并执行一次"执行体"。exp3是可选的,如果不指定,默认为1。
实例
for i=1,f(x) do
print(i)
end
for i=10,1,-1 do
print(i)
end
for的三个表达式在循环开始前一次性求值,以后不再进行求值。比如上面的f(x)只会在循环开始前执行一次,其结果用在后面的循环中。
验证如下:
#!/usr/local/bin/lua
function f(x)
print("function")
return x*2
end
for i=1,f(5) do print(i)
end
以上实例输出结果为:
function
1
2
3
4
5
6
7
8
9
10
泛型for循环
泛型for循环通过一个迭代器函数来遍历所有值,类似java中的foreach语句。Lua 编程语言中泛型for循环语法格式:
--打印数组a的所有值
for i,v in ipairs(a)
do print(v)
end
i是数组索引值,v是对应索引的数组元素值。ipairs是Lua提供的一个迭代器函数,用来迭代数组。
实例
#!/usr/local/bin/lua
days = {"Suanday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}
for i,v in ipairs(days) do print(v) end
以上实例输出结果为:
Suanday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday