Lua整理

作者: 水煮鱼又失败了 | 来源:发表于2020-05-22 13:05 被阅读0次

    目录

    [TOC]

    1 简介

    Lua是C语言开发的轻量脚本语言,以源代码形式开放。

    设计的目的是,嵌入到应用程序中,为应用程序提供灵活的扩展定制功能。

    官网:

    http://www.lua.org/

    中文参考手册:

    https://www.runoob.com/manual/lua53doc/contents.html

    2 安装

    2.1 网页运行地址

    官方demo地址,这在网页运行脚本:

    https://www.lua.org/cgi-bin/demo

    2.2 linux安装

    • 安装依赖
    yum install libtermcap-devel ncurses-devel libevent-devel readline-devel
    
    • 下载编译安装
    #下载
    wget http://www.lua.org/ftp/lua-5.3.5.tar.gz
    #解压
    tar -xzvf lua-5.3.5.tar.gz
    #切换目录
    cd lua-5.3.5
    #编译
    make linux
    #安装
    make linux install
    
    • 校验

      • 查看明了文件

        /usr/local/bin目录下会出现执行文件:lua、luac。

      • 查看当前版本

        [root@localhost /]# lua -v
        Lua 5.3.5  Copyright (C) 1994-2018 Lua.org, PUC-Rio
        
      • 简单命令测试

        [root@localhost /]# lua
        Lua 5.3.5  Copyright (C) 1994-2018 Lua.org, PUC-Rio
        > print('hello world')
        hello world
        >
        

    2.3 windows安装

    2.3.1 安装LuaForWindows
    • 下载地址

    https://github.com/rjpcomputing/luaforwindows/releases

    • 配置SciTE

      • 代码提示

        Options->Open User Options File,增加如下配置:

        # 增加代码提示功能( 当按下句点 '.', 以及字母键的时候, 弹出自动完成提示。)
        autocomplete.*.start.characters=.$(chars.alpha)
        
    • 支持中文

      #支持中文字符++++++++++++++++++++++++++++
      #支持中文 963表示简体中文
      code.page=936
      output.code.page=936
      #不启用的话,在输出区中文可能会乱码
      character.set=134
      
    2.3.2 Idea安装插件

    idea选择插件EmmyLua,进行安装。

    新建项目时,项目类型选择Lua

    2 编程方式

    代码不需要以;结尾,区分大小写。

    • 交互式编程

      可通过lua控制台,输入程序,查看结果。

    • 脚本式编程

      编写lua脚本*.lua,执行脚本查看结果。

    3 注释

    3.1单行注释

    -- 单行注释
    

    3.2 多行注释

    --[[
        多行注释1
        多行注释2
    ]]
    

    3 数据类型

    8种数据类型,通过关键字type可查看数据类型。

    function fun1()
       -- function body 
    end
    print(type(123),type('tom'),type({}),type(fun1));
    

    执行结果:

    number string table function

    3.1 nil

    nil表示空,没有值。if判断中nil和false都属于false0为true

    使用未定义的变量时,结果为nil,删除变量时,也通过赋值为nil实现。

    3.2 boolean

    布尔类型,有两个值,true和false。

    3.3 string

    字符串类型,可用单引号或双引号表示字符串。

    字符串拼接使用..,如下:

    print('123'..'456')
    

    执行结果为:

    123456

    3.4 number

    双精度浮点数,8个字节。

    3.4.1 隐式转换

    通过运算,string转换number

    字符类型的变量执行数字运算,如字符串中的内容均为数字,则执行结果的类型为number,如下:

    a,b='123','456'
    c=a+b
    print(c)
    print(type(a),type(b),type(c))
    

    执行结果:

    579
    string string number

    如字符串执行数字运算,字符串中的内容不为数字,则执行报错

    a,b='123','abc'
    c=a+b
    print(c)
    print(type(a),type(b),type(c))
    

    执行结果:

    lua.exe: test1.lua:2: attempt to perform arithmetic on global 'b' (a string value)
    stack traceback:
    test1.lua:2: in main chunk

    3.5 table

    table(表),是lua中灵活的数据结构,可以用来创建自己的数据结构,类似于java中的map。table有类似map的key和map。

    3.5.1 初始化

    同一个table中,key既可以为数字,也可以为字符串,value可以为任意类型

    • 构建list

      tab={'tom','jack'}
      for k,v in pairs(tab) do
          print(type(k),type(v),k,v)
      end
      

      结果如下:

      number string 1 tom
      number string 2 jack

    • 构建map

      tab={name='tom',age=18}
      for k,v in pairs(tab) do
          print(type(k),type(v),k,v)
      end
      

      结果如下:

      string string name tom
      string number age 18

    • 混合构建

      tab={'tom',name='zhangsan','jack',age=14}
      for k,v in pairs(tab) do
          print(type(k),type(v),k,v)
      end
      

      number string 1 tom
      number string 2 jack
      string string name zhangsan
      string number age 14

    3.5.2 设置获取值

    table中代表列表key索引值从1开始,而不是从0开始

    key只能为数字或字符串。如table为tab1,
    当key为数字时,获取key对应的内容为:tab[1],设置key的值为:tab[1]=xxx
    当key为数字或字符串时,获取key对应的内容为tab['myKey']tab.myKey,设置key的值为:tab['myKey']=xxxtab.myKey=xxx

    3.6 function

    3.6.1 格式

    格式

    optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)
        function_body
        return result_params_comma_separated
    end
    

    参数说明

    optional_function_scope: 该参数是可选的制定函数是全局函数还是局部函数,未设置该参数默认为全局函数,如果你需要设置函数为局部函数需要使用关键字 local。
    function_name: 指定函数名称。
    argument1, argument2, argument3..., argumentn: 函数参数,多个参数以逗号隔开,函数也可以不带参数。
    function_body: 函数体,函数中需要执行的代码语句块。
    result_params_comma_separated: 函数返回值,Lua语言函数可以返回多个值,每个值以逗号隔开。

    举例:

    function funTest()
        -- function body
    end
    
    3.6.2 参数

    参数可以为定长参数,也可以为变长参数。

    • 定长参数

      function funTest(name,age)
          print(name,age)
      end
      funTest('tom',14)
      

      输出结果:

      tom 14

    • 变长参数

      变长参数,函数定义时用...来表示。

      函数内部,通过{...}获取变长参数,获取的结果类型为table

      函数内部,可以通过select关键字获取可变参数的相关信息。select('#'...)表示获取可变参数的长度;select(n,...)表示获取第n个到第select('#',...)个的参数结果,获取的内容为一组返回值,获取的类似function返回的多个值,而不是table。

    • 举例:

      --定义函数
      function funTest(...)
          print('[参数类型]:'..type({...}))
          print('[参数个数]:'..select('#',...))
          for v,k in pairs({...}) do
              print(v,k)
          end
          print('[select循环参数]:')
          for i=1,select('#',...) do
              local val=select(i,...)
              print(i,val) 
          end
      end
      --调用函数
      funTest('tom',14,'remark')
      

      输出结果:

      [参数类型]:table
      [参数个数]:3
      1 tom
      2 14
      3 remark
      [select循环参数]:
      1 tom
      2 14
      3 remark

    3.6.3 返回值

    函数可以有多个返回值,如下:

    --定义函数
    function funTest()
        return 'tom',14,'remark'
    end
    --调用函数
    a,b,c,d=funTest();
    print(a,b,c)
    

    执行结果:

    tom 14 remark

    3.6.4 First-Class Value

    第一函数值,函数名和变量名之间没有区别,他们之间可以互相赋值

    function fun1()
        print("fun1")
    end
    a=123
    print(a)
    a=fun1
    print(a
    

    执行结果:

    123
    function: 00C6BC40

    3.6.5 匿名函数

    函数支持匿名函数,类似java中的匿名函数。

    function fun1(name,printFun)
        printFun(name)
    end
    fun1("tom",function(myName)
        print(myName .. ' is call')
    end)
    

    执行结果:

    tom is call

    3.7 thread

    线程相关,待完善。

    3.8 userdata

    C语言结构相关,待完善。

    4 变量

    4.1 作用范围

    默认情况下,所有变量均为全局变量,如将变成设置为局部变量,变量前需加local关键字,如下:

    local userName='tom'
    

    4.2 命名规则

    • 变量命名,可以有字母、数字。下划线
    • 只可以以字母、下划线开头定义变量。不可以以数字开头,不建议以_+大写字母开头,否则容易和lua内部变量冲突(lua内部变量采用此命名规则)
    • 不可以用关键字作为变量

    4.3 类型

    变量类型可以根据变量的值确定。同一个变量多次赋值不同类型的数据后,变量类型发生变化。

    执行代码:

    a='tom'
    print(a)
    a=123
    print(a)
    

    执行结果:

    tom
    123

    4.4 赋值

    • 为多个参数赋值

      可以一次性给多个参数赋值。类似

      prarm1,param2,parma3=value1,value2,value3

      会依次将=号右边的值按照顺序依次赋值给左边的变量。=号``两侧的数量可以不一致,当变量个数比值的个数多时,后面多余的变量自动赋值为nil(相当于没有定义该变量),当变量的个数比值的个数少的时候,多余的赋值,将忽略。

    • 执行顺序

      lua中对参数赋值时,先将=号右面的内容计算完毕后,再赋值给左边。

      因此,交换变量内容时,可以写作:

      a,b=123,456
      print(a,b)
      a,b=b,a
      print(a,b)
      

      执行结果:

      123 456
      456 123

    4.5 删除

    获取没有定义的变量,内容为nil。变量直接赋值为nil,则将变量删除。

    如果给变量赋值为nil,和变量未初始化,效果一样。

    执行代码:

    -- 调用未定义的变量
    print(a)
    -- 变量赋值
    a='tom'
    print(a)
    -- 删除变量
    a=nil
    print(a)
    

    执行结果:

    nil
    tom
    nil

    4.6 值传递/引用传递

    值传递:变量之间赋值,将老变量的内容拷贝了一份给新的变量。新的变量更改内容不影响老的变量。
    引用传递: 变量之间的赋值,将老的变量对内容的引用传递给信的变量,新老变量对应的内容内存地址一致,新的变量和老的变量更改内容,均会影响对方。

    lua变量赋值,table为引用传递,其他均为值传递

    • 值传递

      a=123
      b=a
      b=456
      print(a,b)
      

      执行结果:

      123 456

    • 引用传递

      function printTable(tab)
          for k,v in pairs(tab) do
              print(k,v);
          end
      end
      a={name="tom",age="18"}
      b=a
      printTable(a)
      printTable(b)
      b.name='jerry'
      print('===============after change===============')
      printTable(a)
      printTable(b)
      

      执行结果:

      name tom
      age 18
      name tom
      age 18
      ===============after change===============
      name jerry
      age 18
      name jerry
      age 18

    5 流程

    5.1 循环

    5.1.1 for循环
    • 数值for循环

      数值for循环,根据条件判断指定的循环次数,每次循环执行对应循环体。

      主要用来指定循环次数,exp1,exp2如果为公式,只执行一次。

      • 格式
      for var=exp1,exp2,exp3 do  
          -- <执行体>  
      end  
      

      var 从exp1变化到exp2,中间每次变化的步长为exp3。exp3可以省略,默认为1。

      • 具体
    • 泛型for循环

      泛型for循环,主要用来遍历table。

      格式:

      for k,v in pairs(table1) do
        -- <执行体>
      end
      

      其中,k为table的键,v为table的值。

      循环会过滤掉值为nil的key(table中key对应的值为nil,表示key不存在),如下:

      function printTable(tab)
          for k,v in pairs(tab) do
              print(k,v);
          end
      end
      tab1={name="tom",remark=nil,age=18,other=nil}
      printTable(tab1)
      

      执行结果如下,会忽略掉值为nil的键,remark和other:

      age 18
      name tom

    5.1.2 while循环
    • 格式

      while(condition)
      do
         -- <执行体>
      end
      

      根据条件condition判断是否执行。

    5.2 if判断

    ​ if条件判断,可以进行嵌套

    • if语句

      if(布尔表达式)
      then
         --[ 在布尔表达式为 true 时执行的语句 --]
      end
      
    • if...else语句

      if(布尔表达式)
      then
         --[ 布尔表达式为 true 时执行该语句块 --]
      else
         --[ 布尔表达式为 false 时执行该语句块 --]
      end
      
    • if...elseif...else 语句

      if( 布尔表达式 1)
      then
         --[ 在布尔表达式 1 为 true 时执行该语句块 --]
      
      elseif( 布尔表达式 2)
      then
         --[ 在布尔表达式 2 为 true 时执行该语句块 --]
      
      elseif( 布尔表达式 3)
      then
         --[ 在布尔表达式 3 为 true 时执行该语句块 --]
      else 
         --[ 如果以上布尔表达式都不为 true 则执行该语句块 --]
      end
      

    6 模块

    6.1 用途

    6.2 举例

    定义文件myModule.lua

    -- 定义私有表
    local myModule={name='tom'}
    local function getResult(param)
        -- 私有方法
        return myModule.name .. ' say:' .. param
    end
    function myModule:say(param)
        -- 公有方法
        print(getResult(param))
    end
    -- 返回表
    return myModule
    

    调用:

    myModule=require('myModule')
    myModule:say('hello')
    

    执行结果:

    tom say:hello

    6.3 加载机制

    ...

    相关文章

      网友评论

          本文标题:Lua整理

          本文链接:https://www.haomeiwen.com/subject/hjfbohtx.html