Lua整理

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 加载机制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值