zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    POJ 1611 The Suspects
    POJ 2001 Shortest Prefixes(字典树)
    HDU 1251 统计难题(字典树 裸题 链表做法)
    G++ C++之区别
    PAT 乙级 1013. 数素数 (20)
    PAT 乙级 1012. 数字分类 (20)
    PAT 乙级 1009. 说反话 (20)
    PAT 乙级 1008. 数组元素循环右移问题 (20)
    HDU 6063 17多校3 RXD and math(暴力打表题)
    HDU 6066 17多校3 RXD's date(超水题)
  • 原文地址:https://www.cnblogs.com/HKUI/p/6756222.html
Copyright © 2011-2022 走看看