Lua中的控制结构

摘要:
Lua提供了一组传统而紧凑的控制结构,包括if for条件执行、while、repeat和for for迭代。如果条件为假,则循环结束;否则,Lua将执行循环体并重复该过程--打印第一行输入不是空的内容repeatline=io Read()直到line~=“”打印与大多数其他语言不同,因为在Lua中,循环体中声明的局部变量的作用包括条件测试:localsqr=x/2repeattsqr=/2loclerror=math。absuntilerror˂x/10000--您仍然可以访问error4。Numeric for for循环有两种形式:Numeric for和generic for。第三个表达式exp3是可选的。如果未指定,Lua将默认步长为1。

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 = 0
end

若要编写嵌套的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/2
repeat
    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) end
for 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中所有的key
for k in pairs(t) do print(k) end

标准库提供了几种迭代器,包括:
    用于迭代文件中每行的(io.lines);
    迭代table元素的(pairs);
    迭代数组元素的(ipairs);
    迭代字符串中单词的(string.gmatch)等。

免责声明:文章转载自《Lua中的控制结构》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇如何避免亚稳态sharepoint:workflow权限代码示例 金大昊(jindahao)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Openresty常用指令和参数

--[[ 参考文档: https://www.nginx.com/resources/wiki/modules/lua/#nginx-api-for-lua Nginx Lua模块指令: Nginx共11个处理阶段,而相应的处理阶段是可以做插入式处理,即可插拔式架构; 另外指令可以在http、server、server if、locatio...

LUA可变长参数 ... 三个点

本文翻译自 LUA官方文档 When a function is called, the list of arguments is adjusted to the length of the list of parameters, unless the function is a vararg function, which is indicated by...

Lua function 函数

Lua支持面向对象,操作符为冒号‘:’。o:foo(x) <==> o.foo(o, x). Lua程序可以调用C语言或者Lua实现的函数。Lua基础库中的所有函数都是用C实现的。但这些细节对于lua程序员是透明的。调用一个用C实现的函数,和调用一个用Lua实现的函数,二者没有任何区别。 函数的参数跟局部变量一样,用传入的实参来初始化,多余的实...

调试lua代码

lua没有调试器,但是它提供了很强的调试功能(debug 库), 所以其实一些常用的调试功能都能很方便的使用,就像使用一个命令行调试器一样: 【例子程序】 -- debug.luagvar1 = 100 function foo() local var2 = 10 function bar()...

Squirrel语言初探(可以使用VC6或者MinGW编译)

Squirrel语言初探 为啥我要关注Squirrel语言?原来Squirrel就很像我希望设计出的理想中的语言(当然也不完全符合)。比如我觉得Lua的语法表述不清晰,累赘,于是想用C系语法来代替Lua语法,于是Squirrel实现了;比如Lua中没有类的结构,我想在我的语言里面加入类(基于表来实现),于是Squirrel实现了;比如我痛恨~=号,–[[...

关于c调用lua 对‘luaL_newstate()’未定义的引用的问题解决办法

#include <string.h>#include "lua.h"#include "lauxlib.h"#include "lualib.h"int main(int argc, char *argv[]){char buff[256];int error;lua_State *L = luaL_newstate();luaL_openl...