• lua语法基本


    lua的下载

    http://luabinaries.sourceforge.net/
    点击所要下载的版本
    比如我下的是5.3.3
    https://sourceforge.net/projects/luabinaries/files/5.3.3/
    下载windows下二进制文件
    lua-5.3.3_Win32_bin.zip

    解压完后

    在同目录下建立test.lua

    print("hello lua");
    for i=1,10,2 do
            print(i)
    end

    执行

    E:lua>lua53 test.lua
    hello lua
    1
    3
    5
    7
    9
    View Code

    for i=起始值,结束值,步长
    步长可以省略 默认是1

    lua的值和类型

    字符串和布尔

    test.lua

    a="abc"
    b=false
    c=true
    d='ds'
    e=3.1415926
    print(a,b,c,d,e);

     E:lua>lua53 test.lua

    abc false true ds 3.1415926

    lua的比较操作符

    操作符

    说明

    ==

    比较两个操作数的类型和值是否都相等

    ~=

    ==结果相反

    <,>,<=,>=

     
    --数字操作符的操作数如果是字符串会自动转换成数字
    a=1+1
    b=1+'1'
    --c=1+'c'  出错
    print(a,type(a),b,type(b),a==b) --2       number  2.0     number  true
    
    --比较操作符不同于数学操作符,不会对操作数的类型自动转换
    print(1=='1')   --false
    print({'a'}=={'a'})  --false
    
    print(tonumber('F',16))  --15

    lua中的table
    table=数组+映射
    lua中单行注释 --
    块注释
    --[[

    ]]

    数组
    数组的下标识从1开始的而不是0
    数组的下标必须连续,否者就是映射了

    a={10,20,"lua"}
    --[[
    或者
    a={}
    a[1]=10
    a[2]=20
    a[3]="lua"
    ]]
    
    print(a[1],a[2],a[3]);

    E:lua>lua53 test.lua
    10 20 lua

    映射

    a={
            ["key1"]=10,
            [2]=false
    }
    --[[
    或者
    a={}
    a['key1']=10
    a[2]=false
    ]]
    print(a.key1,a[2]);

    lua函数
    函数的调用必须在声明的后面(代码的位置顺序)
    test.lua

    function add(a,b)
            return a+b
    end
    add1=function ( a,b)
            return a+b
    end
    print(add(1,2))
    print(add1(1,2))

    E:lua>lua53 test.lua
    3
    3

    函数的多返回值

    function add(a,b)
            return a+b,a-b,a*b
    end
    r=add(2,5);
    print(add(2,5))
    print(r,type(r));

    E:lua>lua53 test.lua
    7 -3 10
    7 number

    可以在Lua中创建一个具有可变参数的函数...作为它的参数

    function average(...)
       result = 0
       local arg={...}
       for i,v in ipairs(arg) do
          result = result + v
       end
       return result/#arg
    end
    
    print("The average is",average(1,2,3,4,5,6))

    E:lua>lua53 test.lua
    The average is 3.5

    多变量的赋值和值的交换

    a,b=1,2
    print(a,b)
    a,b=b,a
    print(a,b)
    c,d=1
    print(c,d)
    e,f=1,2,3
    print(e,f)
    g,h=1,
    print(g,h) 
    E:lua>lua53 test.lua
    1       2
    2       1
    1       nil
    1       2
    nil     nil

    多重赋值时,lua会先计算所有表达式的值

    local a= {1,2,3}
    local i=1
    i,a[i]=i+1,5
    print(i) --2
    for k1,v1 in ipairs(a) do
        print(k1,v1)
    end
    
    --[[
    2
    1       5
    2       2
    3       3
    ]]

    lua计算完所有表达式的值后,上面最后一个赋值语句成为

    i,a[1]=2,5

    lua的表达式逻辑操作符

    只要操作数不是nil或者false,逻辑操作符就认为操作数为真

    操作符

    说明

    not

    根据操作数的真假相应的返回falsetrue

    and

    a and b a 为真返回b,否者返回a

    or

    a or ba是假则返回a ,否者返回b

    print(1 and 5)  --5
    print(1 or 5)   --1
    print(not 0)   --false
    print(not 1)   --false
    print('' or 1);  --''
    print(true and false)
    print(true and true)
    print(true or false)
    print(not true)
    print(not false)
    
    --字符串拼接
    print("hello".." world");
    E:lua>lua53 test.lua
    false
    true
    true
    false
    true
    hello world
    View Code

    作用域

    function fun()
            a=1
            local b=2
    end
    fun()
    print(a,b)
    E:lua>lua53 test.lua
    1       nil
    local x = 10
    if true then
        local x=x+1
        print(x)
        do
            local x=x+1
            print(x)
        end
        print(x)
    end
    print(x)
    --[[
    执行结果
    11
    12
    11
    10
    ]]

    lua的流程控制
    if elseif

    a=1
    if(a>1) then
            print("a>1")
    elseif(a<1) then
            print("a<1")
    else
            if(a==1) then 
                    print("a=1")
            else
                    print("a is not num")
            end
    end

    a必须是数字,否者不能参与比较
    elseif不可以写成else if lua里没i++

    while

    local i=0
    while i<10 do
            print(i)
            i=i+1
    end

    repeat
    statement(s)
    until( condition )

    i=1
    repeat 
        print(i);
        i=i+1
    until(i>5)

    for循环
    for i=起始值,终点值,步长
    步长可以省略 默认是1

    for i=1,10 do
            print("i="..i)
    end
    for j=1,10,2 do
            print("j="..j)
    end
    E:lua>lua53 test.lua
    i=1
    i=2
    i=3
    i=4
    i=5
    i=6
    i=7
    i=8
    i=9
    i=10
    j=1
    j=3
    j=5
    j=7
    j=9
    View Code

    for的泛型遍历

    迭代器
    pairs() 遍历table里的所有元素
    ipairs() 只遍历数组(必须1开始的键 而且必须连续)

    迭代器 http://www.cnblogs.com/HKUI/articles/6757372.html

    a={
        ['a']='ajax',
        [100]=true,
        [1]=1,
        [2]=3
    }
    for k,v in pairs(a) do
        print(k,v)
    end
    print("----------------------")
    for k1,v1 in ipairs(a) do
        print(k1,v1)
    end
    2次运行,对于pairs顺序完全是没有保障的
    E:lua>lua53 test.lua
    100     true
    1       1
    2       3
    a       ajax
    ----------------------
    1       1
    2       3
    
    E:lua>lua53 test.lua
    100     true
    a       ajax
    2       3
    1       1
    ----------------------
    1       1
    2       3
    View Code
    a={
        ['a']='ajax',
        [99]=999,
        [100]=true,
        [2]=3
    }
    for k,v in pairs(a) do
        print(k,v)
    end
    print("----------------------")
    for k1,v1 in ipairs(a) do
        print(k1,v1)
    end
    E:lua>lua53 test.lua
    a       ajax
    100     true
    2       3
    99      999

    二维或多维数组

    arr={
        {'a','b','c'},
        {'aa','bb','cc'},
        {['a']='ajax'}
    
    }
    for k,v in pairs(arr) do
        for k1,v1 in pairs(v) do 
            print(k..'-'..k1,v1)
        end
    end
    E:lua>lua53 test.lua
    1-1     a
    1-2     b
    1-3     c
    2-1     aa
    2-2     bb
    2-3     cc
    3-a     ajax
    View Code

    lua里的包

    同目录下有 foo.lua,test.lua
    foo.lua

    local class={}
    function class.foo( a,b )
        return a+b
    end
    return class

    test.lua

    local c=require("foo")
    print(c);
    print(c.foo(1,2))
    
    for i=1,2 do
        print(require("foo"))
    end
    print("-------------")
    for i=1,2 do
        print(dofile("foo.lua"))
    end
    E:lua>lua53 test.lua
    table: 00038798
    3
    table: 00038798
    table: 00038798
    -------------
    table: 0003bcf8
    table: 0003bcd0
    View Code

    require与dofile
    require运行多次 ,对于同一个table 只加载一次
    dofile运行多次,对于同一个table,每次都是重新加载

     lua的系统库

    local t={}
    for i=1,5 do
        table.insert(t,i..'_'..i)
    end
    
    for k,v in pairs(t) do
        print(k..'='..v)
    end
    print("----------");
    table.remove(t,2)
    for k,v in pairs(t) do
        print(k..'='..v)
    end
    
    for k,v in pairs(table) do
        print(k,v)
    end

    运行

    E:lua>lua53 test.lua
    1=1_1
    2=2_2
    3=3_3
    4=4_4
    5=5_5
    ----------
    1=1_1
    2=3_3
    3=4_4
    4=5_5
    sort    function: 62995870
    move    function: 62995940
    insert  function: 62995e00
    remove  function: 62995c40
    pack    function: 62995160
    concat  function: 62995fa0
    unpack  function: 62994fc0
    View Code

    对于映射的删除需用赋值nil

    local t={}
    t.a="ajax"
    t.b="bbc"
    for k,v in pairs(t) do
        print(k,v)
    end
    table.remove(t,a)
    print("------------");
    for k,v in pairs(t) do
        print(k,v)
    end
    print("---------")
    t.a=nil
    for k,v in pairs(t) do
        print(k,v)
    end

     执行

    E:lua>lua53 test.lua
    a       ajax
    b       bbc
    ------------
    a       ajax
    b       bbc
    ---------
    b       bbc
    View Code

    数组长度和字符串长度

    local t={
        ['a']="ajax",
        ['b']="bbc",
        [1]=11,
        [2]=222
    }
    print("t len= "..#t);
    local t1={1,2,3,4}
    print("t1 len= "..#t1)
    
    local str="php7"
    print("str len= "..#str)
    E:lua>lua53 test.lua
    t len= 2
    t1 len= 4
    str len= 4

    tonumber,tostring
    string.format() 类似c中printf

    a="3.14"
    print(a,type(a));
    a=tonumber(a)
    print(a,type(a));
    
    b=3.1415
    print(b,type(b))
    b=tostring(b)
    print(b,type(b))
    
    person="tom"
    print(string.format("hello %s",person))
    E:lua>lua53 test.lua
    3.14    string
    3.14    number
    3.1415  number
    3.1415  string
    hello tom

     lua字符串操作

    1.单引号之间的字符
    2.双引号之间的字符
    3.[[]]

    test.lua
    str1='php'
    str2="javascript"
    str3=[[php7]]
    str4="php " best" "
    str5='php "best"'
    str6=[[php "best"]]
    print("str1="..str1)
    print("str2="..str2)
    print("str3="..str3)
    print("str4="..str4)
    print("str5="..str5)
    print("str6="..str6)
    E:lua>lua53 test.lua
    str1=php
    str2=javascript
    str3=php7
    str4=php " best"
    str5=php "best"
    str6=php "best"

    字符串操作方法

    for k,v in pairs(string) do
        print(k)
    end
    E:lua>lua53 test.lua
    gsub
    gmatch
    match
    len
    byte
    char
    lower
    sub
    format
    upper
    dump
    rep
    find
    unpack
    packsize
    pack
    reverse
    test.lua
    s="php5 pHp7"
    lower_s=string.lower(s)
    upper_s=string.upper(s)
    gsub=string.gsub(s,'php','python')
    reverse=string.reverse(s)
    rep=string.rep('p',3)
    
    print("lower_s="..lower_s)
    print("upper_s="..upper_s)
    print("gsub="..gsub)
    print("reverse="..reverse)
    print("rep="..rep)
    
    E:lua>lua53 test.lua
    lower_s=php5 php7
    upper_s=PHP5 PHP7
    gsub=python5 pHp7
    reverse=7pHp 5php
    rep=ppp
  • 相关阅读:
    欧拉计划之题目2:在斐波那契数列中,找出4百万以下的项中值为偶数的项之和。
    MFC非模态对话框的销毁
    MFC:只允许产生一个应用程序实例的具体实现
    从_tiddata看CRT的线程不安全函数
    关于消息循环的深入分析
    MFC:关于MFC窗口对象(CWnd对象)与Window对象(HWND所指对象)的销毁问题
    使用FindFirstFile和FindNextFile对给定目录下所有文件进行广度优先遍历
    工作线程的消息循环与通信
    MFC和设计模式
    _endthreadex与CloseHandle
  • 原文地址:https://www.cnblogs.com/HKUI/p/6756222.html
Copyright © 2020-2023  润新知