当前位置 博文首页 > 浅谈Lua语句

    浅谈Lua语句

    作者:admin 时间:2021-02-04 09:14

    Lua 中的语句支持赋值,控制结构,函数调用,还有变量声明。

    不允许空的语句段,因此 ;; 是非法的。

    1 语句组 | chuncks

    复制代码 代码如下:

    chunck ::= {stat[';']}

    ([';'] 应该是表示语句组后面 ; 是可选项。)

    2 语句块 | blocks

    复制代码 代码如下:

    block ::= chunck
    stat ::= do block end

    可以将一个语句块显式地写成语句组,可以用于控制局部变量的作用范围。

    3 赋值 | assignment

    Lua 支持多重赋值。

    多重赋值时,按序将右边的表达式的值赋值给左值。右值不足补 nil,右值多余舍弃。

    复制代码 代码如下:

    b = 1
    a,b = 4 -- a = 4,b = nil
    +++

    Lua 在进行赋值操作时,会一次性把右边的表达式都计算出来后进行赋值。

    复制代码 代码如下:

    i = 5
    i,a[i] = i+1, 7 -- i = 6 ,a[5] = 7

    特别地,有

    x,y = y,x -- 交换 x,y 的值
    +++

    对全局变量以及表的域的赋值操作含义可以在元表中更改。

    4 控制结构

    4.1 条件语句

    复制代码 代码如下:

    if [exp]
        [block]
    elseif [exp]
        [block]
    else
        [block]
    end

    4.2 循环语句

    复制代码 代码如下:

    while [exp]
        [block]
    end
    +++

    repeat
        [block]
    until [exp]

    注意,由于 repeat 语句到 until 还未结束,因此在 until 之后的表达式中可以使用 block 中定义的局部变量。

    例如:

    复制代码 代码如下:

    a = 1
    c = 5
    repeat
        b = a + c
        c = c * 2
    until b > 20
    print(c)            -->     40
    +++

    4.3 break 和 return

    break 和 return 只能写在语句块的最后一句,如果实在需要写在语句块中间,那么就在两个关键词外面包围 do end 语句块。

    do break end

    5 For 循环

    for 循环的用法比较多,单独拎出来讲。

    for 中的表达式会在循环开始前一次性求值,在循环过程中不再更新。

    5.1 数字形式

    for [Name] = [exp],[exp],[exp] do [block] end
    三个 exp 分别代表初值,结束值,步进。exp 的值均需要是一个数字。
    第三个 exp 默认为 1,可以省略。

    复制代码 代码如下:

    a = 0
    for i = 1,6,2 do
        a = a + i
    end

    等价于

    复制代码 代码如下:

    int a = 0;
    for (int i = 1; i <= 6;i += 2){ // 取到等号,如果步进是负的,那么会取 i >= 6
        a += i;
    }

    5.2 迭代器形式

    迭代器形式输出一个表时,如果表中有函数,则输出的顺序及个数不确定(笔者测试得出的结果,具体原因未知)。

    迭代器形式的 for 循环的实质

    -- 依次返回 迭代器、状态表、迭代器初始值

    复制代码 代码如下:

    function mypairs(t)
        function iterator(t,i)
            i = i + 1
            i = t[i] and i      -- 如果 t[i] == nil 则 i = nil;否则 i = i
            return i,t[i]
        end
        return iterator,t,0
    end

    -- 一个表
    t = {[1]="1",[2]="2"}

    -- 迭代形式 for 语句的 等价形式

    复制代码 代码如下:

    do
    local f, s, var = mypairs(t)
        while true do
            local var1, var2 = f(s, var)
            var = var1
            if var == nil then break end

            -- for 循环中添加的语句
            print(var1,var2)

        end
    end

    -- 迭代形式 for 语句

    复制代码 代码如下:

    for var1,var2 in mypairs(t) do
        print(var1,var2)
    end

    --> 1   1
    --> 2   2
    --> 1   1
    --> 2   2

    5.2.1 数组形式

    复制代码 代码如下:

    ary = {[1]=1,[2]=2,[5]=5}
    for i,v in ipairs(ary) do
        print(v)                    --> 1 2
    end

    从1开始,直到数值型下标结束或者值为 nil 时结束。

    5.2.2 表遍历

    复制代码 代码如下:

    table = {[1]=1,[2]=2,[5]=5}
    for k,v in pairs(table) do
        print(v)                    --> 1 2 5
    end

    遍历整个表的键值对。

    关于迭代器的更多内容,可参考Lua 迭代器和泛型 for。

    以上所述就是本文的全部内容了,希望大家能够喜欢。

    js
    下一篇:没有了