• 友链

  • 首页

  • 文章归档
h u a n b l o g
h u a n b l o g

欢

HI,Friend

04月
20
Lua

Lua流程控制和循环语句

发表于 2022-04-20 • 字数统计 2735 • 被 1,678 人看爆

代码块

一个代码块是一个控制结构的主体,或是一个函数的主体,或是一个代码(即变量被声明时所在的文件或字符串):
一般来说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
分享到:
Lua闭包
Lua输入和输出
  • 文章目录
  • 站点概览
欢

网红 欢

你能抓到我么?

Email RSS
看爆 Top5
  • mac系统版本与Xcode版本有冲突 4,080次看爆
  • JAVA_HOME环境配置问题 3,731次看爆
  • AssetBundle使用 3,499次看爆
  • VSCode配置C++开发环境 3,257次看爆
  • Lua反射 3,133次看爆

Copyright © 2025 欢 粤ICP备2020105803号-1

由 Halo 强力驱动 · Theme by Sagiri · 站点地图