控制语句
控制语句
理解
Lua 语言提供的控制结构有 if-else,while,repeat,for,并提供 break、return 关键字来满足更丰富的需求。不支持switch、continue。
Lua 提供的控制语句部分特征类似Shell和Python:
- 语句都以
end结束 if后面都有then- 没有花括号
{} - 循环结构
while、for表达式后面都有关键字do; python里是用的:
if-else
与 C 语言的不同之处是
else与if是连在一起的,若将else与if写成else if则相当于在else里嵌套另一个if语句
-- 单个 if 分支 型
a = 10
if a > 0 then
print(a)
end
-- 两个分支 if-else 型
a = 10
b = 11
if a > b then
print(a)
else
print(b)
end
-- 多个分支 if-elseif-else 型
a = 10
b = 11
if a > b then
print(a)
elseif a < b then
print(b)
else
print(a)
endwhile
Lua 跟其他常见语言一样提供了 while 控制结构,语法上也没有什么特别的。没有提供 do-while 型的控制结构,但是提供了功能相当的 repeat
注意:Lua 并没有像许多其他语言那样提供类似
continue这样的控制语句用来跳过当前循环
sum = 0
i = 0
while i<=100 do
sum = sum + i
i = i + 1;
end
print(sum) -- 5050repeat 的用法
sum = 0
i = 0
repeat
sum = sum + i
i = i + 1;
until i>100
print(sum) -- 5050for
for有两种结构
- 数字 for(numeric for)
- 范型 for(generic for)
数字 for 类似C语言的用法,范型 for 类似Python里的
for...in用法
for数字型
语法格式
for var = begin, finish, step do
--body
end关注以下几点:
var从begin变化到finish,每次变化都以step作为步长递增varbegin、finish、step三个表达式只会在循环开始时执行一次- 第三个表达式
step是可选的,默认为1 - 控制变量
var的作用域仅在for循环内,需要在外面控制,则需将值赋给一个新的变量 - 循环过程中不要改变控制变量的值,那样会带来不可预知的影响
示例
sum = 0
for i=0,100,1 do
sum = sum + i
end
print(sum) -- 5050for 泛型
语法格式
-- 打印数组a的所有值
-- i是数组索引值,v是对应索引的数组元素值
-- ipairs是Lua提供的一个迭代器函数,用来迭代数组
for i,v in ipairs(a) do
print(v)
end示例
days = {
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
}
for k,v in ipairs(days) do
print(k,v)
endipairs 和 pairs 的不同,pairs可以遍历表中所有的key,并且除了迭代器本身以及遍历表本身还可以返回nil。但是ipairs则不能返回nil,只能返回数字0,如果值遇到nil则直接跳出循环退出
-- ipairs遍历时,当key=2时候value就是nil,所以直接跳出循环
local tabFiles = {
[1] = "test1",
[6] = "test2",
[4] = "test3"
}
for k,v in ipairs(tabFiles) do
print(k,v)
end
-- 输出
1 test1
-- 如果换成pairs,则全部输出
1 test1
6 test2
4 test3值得一提的是在 LuaJIT 2.1 中,
ipairs()内建函数是可以被JIT编译的,而pairs()则只能被解释执行 !
break
语句 break 用来终止 while 、 repeat 和 for 三种循环的执行,并跳出当前循环体, 继续执行当前循环之后的语句
return
return 主要用于从函数中返回结果,或者用于简单的结束一个函数的执行
需要注意的是 return 只能写在语句块的最后,一旦执行了 return 语句,该语句之后的所有语句都不会再执行。若要写在函数中间,则只能写在一个显式的语句块内,否则会报错
function test1(x, y)
return x+y;
-- print(x+y)
-- 后面的print如果不注释,会报错
end
function test2(x, y)
if x > y then
return x
else
return y
end
print("end") -- 此处的print不注释不会报错,因为return只出现在前面显式的语句块
end
function test3(x, y)
print(x+y)
do return end
print(x) -- 此处的print不注释不会报错,因为return由do...end语句块包含。这一行语句永远不会执行到
end
test1(10,11)
test2(10,11)
test3(10,11)所以有时候为了调试方便,我们可以想在某个函数的中间提前 return 以进行控制流的短路,此时我们可以将 return 放在一个
do...end代码块中。