在编写代码的过程中,总有许多迭代的代码需求,如计算从1连加到10
的计算,如果数字足够大,使用表达式计算的方法,将无法胜任,我们不可能花费一下午去写一个累加表达式。此时可以借助Lua提供的迭代控制实现,迭代控制主要包含while
、for
、repeat
三种。while
、for
以end
作为显示结尾符;repeat
以until
作为结尾。
其中for
又分为 数值型for
和泛型for
两种。
while
同java
一致,while
控制先检查条件,当条件满足时,将一直循环执行表达式,当条件不满足时,退出循环。比如计算高斯算法,从1累加到100
,使用while
实现如下:
sum = 0
n = 1
while n <= 100 do
sum = sum + n
n = n + 1
end
print(sum)
-->> 5050
repeat
repeat...until
直观意思为重复...直到
。那么该控制语句会不断重复repeat语句
,直到until判断
条件为true
时,终止循环。until
条件判断在repeat
循环体之后,因此同while
一致,循环体至少执行一次。
采用repeat...until
控制语句实现高斯算法:
sum = 0
n = 1
repeat
sum = sum + n
n = n + 1
until n > 100
print(sum)
-->> 5050
如收集用户输入,直到用户输入exit
时,终止输入:
input = ""
repeat
input = io.read()
print(input)
until input == "exit"
-->> hello -- 输入
-->> hello -- 输出
-->> lua -- 输入
-->> lua -- 输出
-->> exit -- 输入
-->> exit -- 输出,程序结束
for(number)
数值型for
语法如下所示
for n = init, target, step do
<执行语句>
end
含义为:当变量n
从初始值init
,改变到target
,每次的步长为step
,对n
进行递增,并且每次递增都执行循环体<执行语句>
。其中步长step
可以省略,将缺省时,默认步长为1
。
使用for
计算高斯算法
sum = 0
for i = 1, 100, 1 do
sum = sum + i
end
print(sum)
-->> 5050
sum = 0
for i = 1, 100 do
sum = sum + i
end
print(sum)
-->> 5050
sum = 0
for i = 100, 1, -1 do
sum = sum + i
end
print(sum)
-->> 5050
在for
语句中,控制变量i
为局部变量,在for
循环体外,将无法访问,如果要在循环之后,访问控制变量的值,需要设置其他变量用以保存该控制变量。
如找到第一个考试不及格的学生位置:
a = {99, 87, 69, 55}
position = -1
for i = 1, #a do
if a[i] < 60 then
position = i
break
end
end
print(position)
-->> 4
for(泛型)
泛型for
循环,通过迭代器函数遍历所有值,内置的迭代器也是编码中常用的几种迭代器如下:
-
文件迭代器
io.lines
,用于循环一个文件内的行信息按行读取文件,并处理每行信息
for v in io.lines("C:\\a.txt") do print(v) end -- a.txt每行一个字母 -->> a -->> b -->> c
-
table
元素迭代器pairs
pairs
迭代器,可适用于table
,同时也可以适用于数组,但反之不行。a = {name = "lua", version = "5.3"} for i, v in pairs(a) do print(i, v) end -->> version 5.3 -->> name lua b = {98, 77, 56} for i, v in pairs(b) do print(i, v) end -->> 1 98 -->> 2 77 -->> 3 56
pairs
迭代是,i
将会被赋予索引值或key,v
将会被赋予元素值。如可以采用pairs
进行遍历table
的所有key:a = {name = "lua", version = "5.3"} for i in pairs(a) do print(i) end -->> version -->> name
-
数组元素迭代器
ipairs
ipairs
可用于迭代数组,不能迭代table
,在迭代过程中,i
被赋予数组的索引值,v
被赋予索引位置的元素值。b = {98, 77, 56} for i, v in ipairs(b) do print(i, v) end -->> 1 98 -->> 2 77 -->> 3 56
当使用数组迭代器
ipairs
迭代table
时,其表现如下a = {name = "lua", version = "5.3"} for i, v in ipairs(a) do print(i, v) end -- 无输出,无法迭代