lua学习之基本语法

  • 赋值语句
    >赋值是改变一个变量的值和改变表域的最基本的方法
    a = "hello" .. "world"
    b = 10
    t.n = t.n + 1

    >Lua 可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会依次赋给左边的变量

    a, b = 10, 2*x  <-->  a=10; b=2*x

    >遇到赋值语句 Lua 会先计算右边所有的值然后再执行赋值操作,所以我们可以这样进行交换变量的值

    x, y = y, x  -- swap 'x' for 'y'
    a[i], a[j] = a[j], a[i] -- swap 'a[i]' for 'a[j]'

    >当变量个数和值的个数不一致时,Lua 会一直以变量个数为基础采取以下策略

    a. 变量个数 > 值的个数 按变量个数补足 nil
    b. 变量个数 < 值的个数 多余的值会被忽略

    a, b, c = 0, 1
    print(a,b,c) --> 0 1 nil
    a, b = a+1, b+1, b+2 -- value of b+2 is ignored
    print(a,b) --> 1 2
    a, b, c = 0
    print(a,b,c) --> 0 nil nil

    >多值赋值经常用来交换变量,或将函数调用返回给变量

    --用f()返回两个值,第一个赋给 a,第二个赋给 b
    a, b = f()

     

  • 局部变量与代码块(block)

    使用 local 创建一个局部变量,与全局变量不同,局部变量只在被声明的那个代码块内有效。代码块:指一个控制结构内,一个函数体,或者一个 chunk(变量被声明的那个文件或者文本串)

    x = 10
    local i = 1  -- local to the chunk
    while i<=x do
    local x = i*2 -- local to the while body
    print(x)  --> 2, 4, 6, 8, ...
    i = i + 1
    end
    if i > 20 then
    local x  -- local to the "then" body
    x = 20
    print(x + 2)    
    else
    print(x)  --> 10 (the global one)
    end
    print(x)  --> 10 (the global one)

    >应该尽可能的使用局部变量,有两个好处:
      1. 避免命名冲突
      2. 访问局部变量的速度比全局变量更快.
    我们给 block 划定一个明确的界限:do..end 内的部分。当你想更好的控制局部变量的作用范围的时候这是很有用的

  • 控制结构语句
    >if语句
    -- 1
    if conditions then
        --then-part
    end;
    -- 2
    if conditions then
       --then-part
    else
        --else-part
    end;
    -- 3
    if conditions then
        --then-part
    elseif conditions then
        --elseif-part
    .. --->多个 elseif
    else
        --else-part
    end;


    2.while语句
    while condition do
    statements;
    end;


    3.repeat-until 语句

    -- 重复直到某个条件成立
    repeat
    statements;
    until conditions;


    4.for语句(有两大类)
    第一,数值 for 循环

    for var=exp1,exp2,exp3 do
    loop-part
    end

    for 将用 exp3 作为 step exp1(初始值)exp2(终止值),执行 loop-part。其中exp3 可以省略,
    默认 step=1
    看下面例子:

    for i=1,10 do
    print(i)
    end
    -- step默认为1,输出1,2,3,4,5,6,7,8,9,10
    
    for i=1,10,2 do
    print(i)
    end
    -- step设置为2,输出1,3,5,7,9

    注意:
    1、三个表达式只会被计算一次,并且是在循环开始前
    2、控制变量 var 是局部变量自动被声明,并且只在循环内有效
    3、循环过程中不要改变控制变量的值,那样做的结果是不可预知的。如果要退出循环,使用 break 语句

    >查找一个元素的位置
    -- find a value in a list
    local found = nil
    for i=1,a.n do
        if a[i] == value then
            found = i -- save value of 'i'
            break
        end
    end
    print(found)

     

    第二,泛型for循环
    --范型 for 遍历迭代子函数返回的每一个值
    for i,v in ipairs(a) do print(v) end
    
    --遍历表 key 
    -- print all keys of table 't'
    for k in pairs(t) do print(k) end

    再看一个例子,假定有一个表

    days = {"Sunday", "Monday", "Tuesday", "Wednesday",
    "Thursday", "Friday", "Saturday"}

    现在想把对应的名字转换成星期几,一个有效地解决问题的方式是构造一个反向表

    revDays = {["Sunday"] = 1, ["Monday"] = 2,
               ["Tuesday"] = 3, ["Wednesday"] = 4,
               ["Thursday"] = 5, ["Friday"] = 6,
               ["Saturday"] = 7}    

    获得Tuesday

    x = "Tuesday"
    print(revDays[x]) --> 3

    >我们不需要手工,可以自动构造反向表

    revDays = {}
    for i,v in ipairs(days) do
      revDays[v] = i
    end

     

  • break和return语句
    >Lua 语法要求 break 和 return 只能出现在 block 的结尾一句(也就是说:作为 chunk的最后一句,或者在 end 之前,或者 else 前,或者 until 前),例如
    local i = 1
    while a[i] do
        if a[i] == v then break end
        i = i + 1
    end

    有时候为了调试或者其他目的需要在 block 的中间使用 return 或者 break,可以显式的使用 do..end 来实现

    function foo ()
        return --<< 这是错误的!!!
        -- 'return' is the last statement in the next block
        do return end -- 应该这样使用
        ... -- statements not reached
    end

     



posted @ 2017-02-23 12:06  Jierism  阅读(319)  评论(0编辑  收藏  举报