代码块
一个代码块是一个控制结构的主体,或是一个函数的主体,或是一个代码(即变量被声明时所在的文件或字符串):
一般来说lua中代码块以end
结尾
例
if then
end
while do
end
for do
end
while i<=x do
local x = i * 2 --局部变量
print(x)
i = i+1
end
控制结构
if then else
根据条件是否满足执行相应的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
如果要编写嵌套的f语句,可以使用elseif
。它类似于在else
后面紧跟一个if
,但可以避免重复使用end
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("无效操作")
end
Lua语言不支持switch语句,所以一般用else-if语句比较常见
while
当条件为真时while循环会重复执行其循环体
local i = 1
while a[i] do
print(a[i])
i = i + 1
end
repeat
repeat-until语句会重复执行其循环体直到条件为真时结束,和其它语言的do-while相似,先执行,在判断
--使用Newton -Raphson法计算'x"的平方根
local sqr = x / 2
repeat
sqr = ( sqr + x/sqr) / 2
local error = math.abs( sqr八N2 - x)
until error < x/10000 --局部变量'error'此时仍然可见
数值型for
for语句有两种形式:数值型for和泛型for。
for var = exp1, exp2, exp3 do
something --代码体
end
在这种循环中,var的值从exp1变化到exp2之前的每次循环会执行sonething,并在每次循环结束后将步长exp3增加到var上。第三个表达式exp3是可选的,若不存在,Lua语言会默认步长值为1。如果不想给循环设置上限,可以使用常量math.huge :
for i = 1, math.huge do
if(0.3 * i ^ 3 - 20 * i ^ 2 - 500 >= 0) then
print(i)
break
end
end
exp3表示每次增加多少,如其它语言一般是i++ 增加1
对应其它的语言for(var i = exp1, i < exp2, i = i + exp3 ){ }
泛型for
泛型for遍历迭代函数返回的所有值,例如之前的pairs、ipairs和io.lines等。
pairs
:可以遍历表中所有的key,并且除了迭代器本身以及遍历表本身还可以返回nil;
ipairs
:则不能返回nil,只能返回数字0,如果遇到nil则退出。它只能遍历到表中出现的第一个不是整数的key。
pairs遍历表中全部key,value
ipairs从下标为1开始遍历,然后下标累加1,如果某个下标元素不存在就终止遍历。这就导致如果下标不连续或者不是从1开始的表就会中断或者遍历不到元素。
--定义两个不同的表
table1 = {[3] = "Hello";a = 1,b = 5,x = 22}
table2 = {[3] = "Hello";a = 1,b = 5,x = 22;"beautiful",[4] = "China"}
for k,v in ipairs(table5) do
print(k .. ":" .. v) -->不输出
end
for k,v in ipairs(table6) do
print(k .. ":" .. v) -->1:beautiful
end
local tables = {"C", "C++", "Java", "C#"}
for k,v in ipairs(tables) do
print(k .. ":" .. v) -->1:C 2:C++ 3:Java 4:C#
end
for k,v in pairs(table5) do
print(k .. ":" .. v) -->a:1 b:5 x:22 3:Hello
end
for k,v in pairs(table6) do
print(k .. ":" .. v) -->1:beautiful 3:Hello a:1 b:5 4:China x:22
end
brak、return、goto
break和return语句用于从当前的循环结构中跳出,goto语句则允许跳转到函数中的几乎任何地方。
goto
后面紧跟着标签名,标签名可以是任意有效的标识符,标签前后紧跟着两个冒号,形如:::name::
,
goto语法
goto 标签名
goto语句规则:不能直接跳转到一个代码块中的标签(因为代码块中的标签对外不可见);其次,goto不能跳转到函数外(注意第一条规则已经排除了跳转进一个函数的可能性)。最后,goto不能跳转到局部变量的作用域。
local a = 1
::label:: print("--- goto label ---")
a = a+1
if a < 3 then
goto label -- a 小于 3 的时候跳转到标签 label
end
使用goto
语句的状态机示例
::s1::do
local c = io.read(1)
if c == '0' then goto s2
elseif c == nil then print'ok'; return
else goto s1
end
end
::s2::do
local c = io.read(1)
if c == '0' then goto s1
elseif c == nil then print'not ok'; return
else goto s2
end
end
goto s1