• Lua中的控制结构


    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)等。

  • 相关阅读:
    codeblocks 配置
    2020-7-28
    echarts markPoint在极坐标散点图中不显示value值
    Oracle cve 2020-14644 分析利用以及回显思路
    Openfire Admin Console SSRF&任意文件读取漏洞 CVE-2019-18394 CVE-2019-18393 poc
    Shiro 回显利用工具(burp
    java反序列化提取payload之Xray高级版的shiro回显poc的提取过程
    CVE-2020-3452 CISCO ASA远程任意文件读取 poc
    记事本陈列-历届数学建模大赛优秀论文(含国赛、美赛、研赛)目录
    懒人必备 |通过爬虫 筛选以及查看CSDN 满足相应积分的资源列表 简单好用
  • 原文地址:https://www.cnblogs.com/moonlightpoet/p/5681859.html
Copyright © 2020-2023  润新知