精华内容
下载资源
问答
  • lua语言
    千次阅读
    2021-07-20 14:05:51

    Lua是一个小巧的脚本语言。它是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo三人所组成的研究小组于1993年开发的。 其设计目的是为了通过灵活嵌入应用程序中从而为应用程序提供灵活的扩展和定制功能。Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。Lua并没有提供强大的库,这是由它的定位决定的。所以Lua不适合作为开发独立应用程序的语言。Lua 有一个同时进行的JIT项目,提供在特定平台上的即时编译功能。

    Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,ini等文件格式,并且更容易理解和维护。 Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。一个完整的Lua解释器不过200k,在所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。 

    保存和运行

    运行可以通过 Lua 的交互模式,也可以用记事本编辑代码保存为 .lua 的格式,通过 Lua 编译器运行。也可以通过第三方工具,将 Lua 打包独立运行。

    目标

    Lua的目标是成为一个很容易嵌入其它语言中使用的语言。大多数程序员也认为它的确做到了这一点。

    很多应用程序、游戏使用LUA作为自己的嵌入式脚本语言,以此来实现可配置性、可扩展性。这其中包括魔兽世界博德之门愤怒的小鸟QQ三国VOCALOID3Garry's Mod太阳神三国杀游戏王ygocore饥荒等。

    特性

    轻量级

    Lua语言的官方版本只包括一个精简的核心和最基本的库。这使得Lua体积小、启动速度快,从而适合嵌入在别的程序里。5.0.2版的Lua的内核小于120KB,而Python的内核大约860KB,Perl的内核大约1.1MB。

    可扩展

    Lua并不象其它许多"大而全"的语言那样,包括很多功能,比如网络通讯、图形界面等。但是Lua提供了非常易于使用的扩展接口和机制:宿主语言(通常是C或C++)提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。

    其它特性

    Lua还具有其它一些特性:同时支持面向过程(procedure-oriented)编程和函数式编程(functional programming);自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象;语言内置模式匹配;闭包(closure);函数也可以看做一个值;提供多线程(协同进程,并非操作系统所支持的线程)支持;通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象虚函数继承重载等。

    应用场景

    • 游戏开发 

    • 独立应用脚本

    • Web 应用脚本

    • 扩展和数据库插件如:MySQL Proxy 和 MySQL WorkBench

    • 安全系统,如入侵检测系统

    示例代码

    是的,你猜对了:Hello,world!

    print"Hello,world!"

    一个比较复杂一点的例子,但是它展示了什么是闭包:

    function create_a_counter()
        local count=0
        return function()
            count = count + 1
            return count
        end
    end

    create_a_counter()返回一个记数器,每次调用这个记数器,都会得到一个比上次大1的值。

    注意:调用的时候,如果你的调用是这样的:

    print(create_a_counter())

    那么每次输出是一样的结果,没有计数的效果,只会输出计数器的地址,应该这样调用:

    ct = create_a_counter()
    print(ct()) --输出> 1
    print(ct()) --输出> 2

    数据交换

    介绍

    Lua和C程序通过一个栈交换数据: struct lua_State

    栈的序号可以从栈顶和栈底计数,从栈底计数,则栈底是1,向栈顶方向递增。从栈顶计数,则栈顶是-1,向栈底方向递减。一般都用从栈底计数的方式。栈的默认大小是20,可以用lua_checkstack修改.用lua_gettop则可以获得栈里的元素数目。并不是说在栈顶有一个整形元素。而是计算了一下栈顶元素在栈里的正index,相当于元素数目。

    Lua 调用C函数用的栈是临时的,调用结束之后就被销毁了。

    如何从栈中获取从Lua脚本中的参数

    如果知道Lua脚本中某个全局变量的名字,可以用

    void lua_getglobal(lua_State *L, const char *name)

    这个函数会将name所指Lua变量的值放在栈顶.

    如果是在C 函数中要获取Lua调用函数使用的参数:

    首先用lua_gettop检查参数数量

    用lua_is 类函数检测参数的类型,做好错误处理

    用lua_to 类函数将参数转换为number或者string。(对Lua来说,只有这两种简单类型)

    1

    2

    lua_tonumber返回的是double

    lua_tostring返回的是char*

    用lua_remove从栈中删除掉元素

    继续获取下一个元素。 因为每次都调用lua_remove,所以每次调用lua_tonumber,使用的index都将固定是-1,即栈顶。

    如果lua_istable成立,那么说明栈顶是一个table 注意 tabl e是不能取出来的,只能把 table 里的元素一个个取出来。

    首先把元素的名字压入栈顶:

    1

    lua_pushstring(L, "i");

    然后就可以用lua_gettable调用,值会放在栈顶。同时刚才压入的元素名字被弹出。用上面的办法,可以把这个值取出来。记得也应该lua_remove。 如果table的某一个元素也是table,重复即可。当table的所有元素都取完了,记住这个table本身还在栈里,要用lua_remove把它删除。

    如果要获取的是一个数组(所谓数组,其实就是key是从1开始的数字序列的table,并且值类型相同),用lua_next可以遍历这个数组:

    首先lua_pushnil,压入一个空值,然后

    while(lua_next(L, -2)!=0)
    {
        if(lua_isnumber(L, -1))//判断元素类型,也可能是string
        {
            arrf.add((float)lua_tonumber(L, -1));//获取元素的值
            lua_remove(L, -1);
        }
    }
    lua_remove(L,-1);//删除NIL

    如何从C返回数据给Lua脚本

    用 lua_push 类函数压入数据到栈中,并用return n;来告诉Lua返回了几个返回值。 Lua是天生支持多个返回值的,如

    x,y = Test()

    Lua会根据n从栈里取相应的数据。

    如果要返回一个table:

    lua_newtable(L);            //创建一个表格,放在栈顶
    lua_pushstring(L,"mydata"); //压入key
    lua_pushnumber(L,66);        //压入value
    lua_settable(L,-3);         //弹出key,value,并设置到table里面去
    lua_pushstring(L,"subdata");//压入key
    lua_newtable(L);            //压入value,也是一个table
    lua_pushstring(L,"mydata"); //压入subtable的key
    lua_pushnumber(L,53);
    valuelua_settable(L,-3);    //弹出key,value,并设置到subtable
    lua_settable(L,-3);         //这时候父table的位置还是-3,弹出key,value(subtable),
                                //并设置到table里去
    lua_pushstring(L,"mydata2");//同上
    lua_pushnumber(L,77);
    lua_settable(L,-3);
    return1;
    //栈里就一个table其他都被弹掉了。如果要返回一个数组,
    //用如下代码:(注意那个关于trick的注释,我在等官方的解释。
    //经过验证,这个问题只在windows版本调用dll中方法的时候出现。WinCE正常)
    lua_pushstring(L,"arri");
    lua_newtable(L);
    {
        //atrick:otherwisetheluaenginewillcrash.ThiselementisinvisibleinLuascript
        lua_pushnumber(L,-1);
        lua_rawseti(L,-2,0);
        for(int i=0; i<arri.size(); i++)
        {
            lua_pushnumber(L, arri);
            lua_rawseti(L, -2, i+1);
        }
    }
    lua_settable(L,-3);

    这样产生的数组可以在Lua中如下遍历:

    for i,v in ipairs(data.arri)
    do
        print(v)
    end

    或者是

    for i=1,table.getn(data.arri)
    do
     print(data.arri)
    end

    只有数组才能这样,name,value构成的Record不行,table.getn也只对数组有效。

    由于上述代码的高度相似性,所以很容易实现自动生成这些代码。比如,根据C的一个struct定义:

    typedef enum{BR_9600,BR_4800,}BaudRate;
    typedef struct flag
    {
        int    onoff;
        int    j;
        long    l;
        double    d;
        char    *name;
        BaudRate    rate;
    }flag;

    可以自动产生如下代码:

    bool DataToLua(flagdata, lua_State*L)
    {
        lua_newtable(L);
        lua_pushstring(L, "onoff");
        lua_pushnumber(L, (double)data.onoff);
        lua_settable(L, -3);
        lua_pushstring(L, "j");
        lua_pushnumber(L, (double)data.j);
        lua_settable(L, -3);
        lua_pushstring(L, "l");
        lua_pushnumber(L, (double)data.l);
        lua_settable(L, -3);
        lua_pushstring(L, "d");
        lua_pushnumber(L, double)data.d);
        lua_settable(L, -3);
        lua_pushstring(L, "name");
        lua_pushstring(L, data.name.c_str());
        lua_settable(L, -3);
        lua_pushstring(L, "rate");
        lua_pushnumber(L, (double)(int)data.rate);
        lua_settable(L, -3);
        return true;
    }

    LuaToData也是类似的。

    如果使用面向对象的方式封装起flag来,把DataToLua变成flag类的一个方法,就更加方便了。

    在线手册

    Lua中文版在线手册。

    使用项目

    Minecraft中的电脑模组(ComputerCraft/OpenComputer)

    所有的伪电脑和turtle(机器人)的代码都是基于Lua的,你可以用它们与有(无)线路由器、打印机、磁盘驱动器、(黄金)显示器互动。

    Adobe Photoshop Lightroom

    Lightroom是Adobe公司的一款摄影后期制作软件,最开始的版本由Shadowland代码编写,后期版本部分使用Lua实现,Lua代码占到代码总量的63%。

    金庸群侠传lua复刻版

    这个游戏,游戏迷们想必都玩过了。牛人用lua脚本重新弄了下。

    魔兽世界

    它的插件用的也是lua。

    仙剑奇侠传五

    解压游戏到资源目录可以看到游戏到脚本全部是使用Lua语言编写的。

    Garry's Mod

    这个游戏的所有创意工坊插件都是由LUA脚本编写的。

    Don't Starve(饥荒)

    Klei 开发的一款动作冒险类求生游戏,于2013年4月23日在PC上发行。游戏及所有创意工坊插件都是由LUA脚本编写的。

    Roblox

    美国的一个游戏平台,每个游戏中的行为都是用Lua配合Roblox的API编写的

    X-Plane

    使用Lua语言编写的第三方插件可以通过第三方脚本加载器插件FlyWithLua加载,让插件开发者可以轻松地编写功能强大的插件用以增强X-Plane的模拟效果

    面向对象编程

    在Lua中,可通过create a module和table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,继承和重载等。

    更多相关内容
  • lua语言入门编程作业,分别用循环语句、一维和二维数组存储,比较简单的代码,供初学者参考,大神请绕行
  • nginx实战-基于lua语言

    2022-02-08 20:34:24
    Nginx实战:基于Lua语言的配置、开发与架构详解
  • 众所周知,深度遍历的递归调用已经普遍,而广度遍历的递归调用较为麻烦。 但是我们老师布置了一道创新题目,让我们实现广度遍历的递归调用。 以下就是我使用递归的思想进行广度遍历。
  • Lua语言

    2021-05-29 19:03:39
    1、Lua简介1.1 Lua是什么1.2 特性1.3 应用场景2...Lua [1] 是一个小巧的脚本语言。它是巴西里约热内卢天主教大学(Pontifical Catholic University ofRio de Janeiro)里的一个由Roberto Ierusalimschy、Waldemar Cele.

    1、Lua简介

    1.1 Lua是什么

    Lua [1] 是一个小巧的脚本语言。它是巴西里约热内卢天主教大学(Pontifical Catholic University ofRio de Janeiro)里的一个由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique deFigueiredo三人所组成的研究小组于1993年开发的。 其设计目的是为了通过灵活嵌入应用程序中从而为应用程序提供灵活的扩展和定制功能。 Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。Lua并没有提供强大的库,这是由它的定位决定的。所以Lua不适合作为开发独立应用程序的语言。Lua 有一个同时进行的JIT项目,提供在特定平台上的即时编译功能。

    简单来说:
    Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

    1.2 特性

    • 支持面向过程(procedure-oriented)编程和函数式编程(functional programming);

    • 自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象;

    • 语言内置模式匹配;闭包(closure);函数也可以看做一个值;提供多线程(协同进程,并非操作系统所支持的线程)支持;

    • 通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,虚函数,继承和重载等。

    1.3 应用场景

    • 游戏开发
    • 独立应用脚本
    • Web 应用脚本
    • 扩展和数据库插件如:MySQL Proxy 和 MySQL WorkBench
    • 安全系统,如入侵检测系统
    • redis中嵌套调用实现类似事务的功能
    • web容器中应用处理一些过滤缓存等等的逻辑,例如nginx。

    2、Lua的安装

    有linux版本的安装也有mac版本的安装。。我们采用linux版本的安装,首先我们准备一个linux虚拟机。

    安装步骤,在linux系统中执行下面的命令。

    curl -R -O http://www.lua.org/ftp/lua-5.3.5.tar.gz
    
    tar zxf lua-5.3.5.tar.gz
    
    cd lua-5.3.5
    
    make linux test
    
    make install
    

    注意:此时安装,有可能会出现如下错误:
    在这里插入图片描述
    此时需要安装lua相关依赖库的支持,执行如下命令即可:

    yum -y install gcc gcc-c++ kernel-devel
    

    此时再执行lua测试看lua是否安装成功

    [root@localhost ~]# lua
    Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
    

    3、入门程序

    创建hello.lua文件,内容为

    vim hello.lua
    

    在文件中输入:

    print("hello");
    

    保存并退出。
    执行命令

    lua hellp.lua
    

    输出为:

    Hello
    

    效果如下:
    在这里插入图片描述

    4、Lua的基础语法

    lua有交互式编程脚本式编程

    交互式编程就是直接输入语法,就能执行。

    脚本式编程需要编写脚本,然后再执行命令 执行脚本才可以。

    一般采用脚本式编程。(例如:编写一个hello.lua的文件,输入文件内容,并执行lua hell.lua即可)

    (1)交互式编程

    Lua 提供了交互式编程模式。我们可以在命令行中输入程序并立即查看效果。
    Lua 交互式编程模式可以通过命令 lua -i 或 lua 来启用:

    lua -i
    

    如下图:
    在这里插入图片描述
    (2)脚本式编程

    我们可以将 Lua 程序代码保持到一个以 lua 结尾的文件,并执行,该模式称为脚本式编程,例如入门程序中将lua语法写到hello.lua文件中。

    4.1 注释

    一行注释:两个减号是单行注释

    --
    

    多行注释:

    --[[
    多行注释
    多行注释
    --]]
    

    4.2 定义变量

    全局变量,默认的情况下,定义一个变量都是全局变量,如果要用局部变量 需要声明为local.例如:

    -- 全局变量赋值
    a=1
    -- 局部变量赋值
    local b=2
    

    如果变量没有初始化:则 它的值为nil 这和java中的null不同。

    如下图案例:
    在这里插入图片描述

    4.3 Lua中的数据类型

    Lua 是动态类型语言,变量不要类型定义,只需要为变量赋值。 值可以存储在变量中,作为参数传递或结果返回。

    Lua 中有 8 个基本类型分别为:nil、boolean、number、string、userdata、function、thread 和 table。

    在这里插入图片描述
    实例:
    在这里插入图片描述

    4.4 流程控制

    (1)if语句

    Lua if 语句 由一个布尔表达式作为条件判断,其后紧跟其他语句组成。
    语法:

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

    实例:
    在这里插入图片描述

    (2)if…else语句

    Lua if 语句可以与 else 语句搭配使用, 在 if 条件表达式为 false 时执行 else 语句代码块。
    语法:

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

    实例:
    在这里插入图片描述

    4.5 循环

    (1)while循环[满足条件就循环 ]

    Lua 编程语言中 while 循环语句在判断条件为 true 时会重复执行循环体语句。
    语法:

    while(condition)
    do
    statements
    end
    

    实例:

    a=10
    while( a < 20 )
    do
    print("a 的值为:", a)
    a = a+1
    end
    

    执行效果
    在这里插入图片描述

    (2)for循环

    Lua 编程语言中 for 循环语句可以重复执行指定语句,重复次数可在 for 语句中控制。
    语法: 1->10 1:exp1 10:exp2 2:exp3:递增的数量

    for var=exp1,exp2,exp3
    do
    <执行体>
    end
    

    语法解释:var 从 exp1 变化到 exp2,每次变化以 exp3 为步长递增 var,并执行一次 “执行体”。exp3 是可选的,如果不指定,默认为1。

    例子:

    for i=1,9,2
    do
    print(i)
    end
    

    for i=1,9,2 :i=1从1开始循环,9循环数据到9结束,2每次递增2
    在这里插入图片描述

    (3)repeat…until语句[满足条件结束]

    Lua 编程语言中 repeat…until 循环语句不同于 for 和 while循环,for 和 while 循环的条件语句在当前循环执行开始时判断,而 repeat…until 循环的条件语句在当前循环结束后判断。(与java语法中do…while类似)

    语法:

    repeat
    	statements
    until( condition )
    

    案例:
    在这里插入图片描述

    4.6 函数

    Lua中也可以定义函数,类似于java中的方法。例如:

    --[[ 函数返回两个值的最大值 --]]
    function max(num1, num2)
    	if (num1 > num2) then
    		result = num1;
    	else
    		result = num2;
    	end
    	return result;
    end
    -- 调用函数
    print("两值比较最大值为 ",max(10,4))
    print("两值比较最大值为 ",max(5,6))
    

    执行之后的结果:

    两值比较最大值为 10
    两值比较最大值为 6
    

    …:表示拼接

    4.7 表

    table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组、字典等。

    Lua也是通过table来解决模块(module)、包(package)和对象(Object)的。

    案例:

    -- 初始化表
    mytable = {}
    -- 指定值
    mytable[1]= "Lua"
    -- 移除引用
    mytable = nil
    

    4.8 模块

    (1)模块定义(类似于Java中方法的概念)
    模块类似于一个封装库,从 Lua 5.1 开始,Lua 加入了标准的模块管理机制,可以把一些公用的代码放在一个文件里,以 API 接口的形式在其他地方调用,有利于代码的重用和降低代码耦合度。

    创建一个文件叫module.lua,在module.lua中创建一个独立的模块,代码如下:

    -- 文件名为 module.lua
    -- 定义一个名为 module 的模块
    module = {}
    -- 定义一个常量
    module.constant = "这是一个常量
    -- 定义一个函数
    function module.func1()
    	print("这是一个公有函数")
    end
    
    local function func2()
    	print("这是一个私有函数!")
    end
    
    function module.func3()
    	func2()
    end
    
    return module
    

    由上可知,模块的结构就是一个 table 的结构,因此可以像操作调用 table 里的元素那样来操作调用模块里的常量或函数。

    上面的 func2 声明为程序块的局部变量,即表示一个私有函数,因此是不能从外部访问模块里的这个私有函数,必须通过模块里的公有函数来调用。

    (2)require 函数

    require 用于 引入其他的模块,类似于java中的类要引用别的类的效果。
    用法:

    require("<模块名>")
    
    require "<模块名>"
    

    两种都可以。

    我们可以将上面定义的module模块引入使用,创建一个test_module.lua文件,代码如下:

    -- test_module.lua 文件
    -- module 模块为上文提到到 module.lua
    require("module")
    
    print(module.constant)
    
    module.func3()
    
    展开全文
  • [Lua语言]Lua语言入门

    2019-08-07 01:07:34
    src.zip,keywords,keywords.lua,operator,compare.lua,numeric.lua,assignment.lua,logic.lua,oop,Overridden.lua,encapsulation.lua,Inheritance.lua,variable,variable.lua,flow,loop.lua,func,func.lua,type,type...
  • 这主要是为了我学习lsp协议和语言分析,所以建议很有帮助。该服务器受到 rust-analyzer 的高度启发,并且有很多与之相似或从中复制的代码。目前只有(部分)实现了解析器。请不要使用这个。安装git clone ...
  • Lua 语言架构设计

    2015-04-26 08:53:13
    详细描述了Lua语言的架构设计,包括指令集,虚拟机等。
  • lua语言服务器在VSCode中安装特征转到定义查找所有参考徘徊诊断程序改名自动完成智能感知签名帮助文件符号工作区符号语法检查强调代码动作 EmmyLua批注多工作区语义标记文字格式预览转到定义查找所有参考徘徊诊断...
  • lua语言入门学习 lua语言的特点及注意事项 文章目录lua语言入门学习lua语言的学习地址一、lua语言特点1.注释2.全局变量和局部变量3.lua数据类型4.字符串类型5.多变量赋值6.泛型for迭代器7.string的一些操作注意事项...

    lua语言入门学习

    lua语言的特点及注意事项



    lua语言的学习地址

    菜鸟教程是前辈给我的学习地址,确实在菜鸟上lua的教学还是非常详细的,下面我的总结就会是提炼其中一些自己模糊不懂的地方。
    lua语言-菜鸟教程


    一、lua语言特点

    1.注释

    lua语言同样分为单行和多行注释,个人觉得lua的注释还是有着其语言自己的特点。
    单行注释:

    --
    

    多行注释:

    --[[
     多行注释
     多行注释
     --]]
    

    2.全局变量和局部变量

    在默认情况下,变量总是认为是全局的。

    全局变量不需要声明,给一个变量赋值后即创建了这个全局变量,访问一个没有初始化的全局变量也不会出错,只不过得到的结果是:nil。

    用local可以将变量声明为局部变量。

    3.lua数据类型

    在这里插入图片描述
    我觉得最需要注意的变量有以下几个:
    1.nil ->这在C语言里类似null的作用。
    2.boolean ->要特别注意的是,lua语言只把false和nil看做是false,而如果是0的话仍然看做是true,这个需要和C语言区分开来。
    3.function没什么好说的,声明一个函数,但是在项目中好像用到的特别多,在我第一次看前辈的代码的时候,感觉引入眼帘的全是function。
    4.table是lua中最具特色的了,里面可以放数字,字符串和表类型,非常简单方便易用。

    4.字符串类型

    1.两个点…是用来完成字符串的连接,而#号是用来获取字符串的长度。
    2.对table的索引使用[],当索引为字符串类型时的一种简化写法是t.i。

    5.多变量赋值

    1.lua语言中可以快捷实现多变量的赋值 a, b = 0, 1

    6.泛型for迭代器

    --打印数组a的所有值  
    a = {"one", "two", "three"}
    for i, v in ipairs(a) do
        print(i, v)
    end 
    

    7.string的一些操作注意事项

    1.print(string.upper(b))
    在使用string.upper函数时,需要注意必须直接输出,否则不会生效,具体的原因我感觉应该是string封装好的操作对其字符串执行完操作后还要对其进行还原。所以说,如果你只是想获得字符串处理之后的结果,直接输出即可。
    2.print(string.find(b, “ter”, 1))
    最后一个参数是看从第几个开始查。
    3.require(“模块名”) 加载模块并直接执行。

    二、注意事项

    1.具体学习

    推荐代码实操,在学习菜鸟驿站的同时一定要在IDEA上打代码,你会发现好多东西和你在学习是所理解的并不一样。

    2.我的学习

    目前能看懂基本语法,知道公司项目代码中的大致意思,但还是不能完全理解里面的一些逻辑。


    总结

    今天是实习第二天,争取学习更多lua语言或者是项目的知识!

    展开全文
  • unity热更新 lua 方案语法基础;热更新是指在不停机的状态下对系统进行更新,例如Windows可以在不重启的状态下完成补丁的更新、Web服务器在不重启的前提下完成对数据和文件的替换等都是热更新的经典实例。
  • 这是编译好的通过lua语言调用libqrencode生成二维码(带demo),源码地址: https://github.com/vincascm/qrencode
  • 一、Lua语言介绍 Lua语言从一开始就被设计为能与C/C++及其他常用语言开发的软件集成在一起使用的语言,这种设计带来了非常多的好处: 一方面, Lua语言不需要在性能、与三方软件交互等C语言已经非常完善的方面...

    一、Lua语言介绍

    • Lua语言从一开始就被设计为能与C/C++及其他常用语言开发的软件集成在一起使用的语言,这种设计带来了非常多的好处:
      • 一方面, Lua语言不需要在性能、与三方软件交互等C语言已经非常完善的方面重复“造轮子”,可以直接依赖C语言实现上述特性,因而Lua语言非常精简
      • 另一方面,通过引入安全的运行时环境、自动内存管理、良好的字符串 处理能力和可变长的多种数据类型, Lua 语言弥补了C语言在非面向硬件的高级抽象能力、 动态数据结构、鲁棒性、调试能力等方面的不足
    • Lua语言强大的原因之一就在于它的标准库,这不是偶然,毕竟扩展性本身就是 Lua语言的主要能力之一。Lua语言中的许多特性为扩展性的实现提供了支持:动态类型使得一定 程度的多态成为了可能,自动内存管理简化了接口的实现(无须关心内存的分配/释放及处 理溢出),作为第一类值的函数支持高度的泛化,从而使得函数更加通用
    • Lua语言除了是一门可扩展的语言外,还是一门胶水语言(glue language)。Lua 语言支 持组件化的软件开发方式,通过整合已有的高级组件构建新的应用。这些组件通常是通过 C/C++等编译型强类型语言编写的, Lua语言充当了整合和连接这些组件的角色。通常,组件(或对象)是对程序开发过程中相对稳定逻辑的具体底层(如小部件和数据结构)的抽象,这些逻辑占用了程序运行时的大部分 CPU 时间,而产品生命周期中可能经常发生变化的逻辑则可以使用 Lua 语言来实现。当然,除了整合组件外 Lua 语言也可以用来适配和改 造组件,甚至创建全新的组件
    • Lua 语言并非这个世界上唯一的脚本语言,还有许多其他的脚本语言提供了类似的能力尽管如此, Lua语言的很多特性使它成为解决许多问题的首选,这些特性如下:
      • 可扩展: Lua 语言具有卓越的可扩展’性 Lua 的可扩展性好到很多人认为 Lua 超越了编 程语言的范畴,其甚至可以成为一种用于构建领域专用语言( Domain-Specific Language,DSL )的工具包 Lua 从一开始就被设计为可扩展的,既支持使用 Lua 语言代码来扩展, 也支持使用外部的C语言代码来扩展。在这一点上有一个很好的例证: Lua 语言的大部分基础功能都是通过外部库实现的。我们可以很容易地将 Lua与C/C++、Java、C#和Python等结合在一起使用
      • 简明: Lua 语言是一门精简的语言。尽管它本身具有的概念并不多,但每个概念都很强大。这样的特性使得 Lua 语言的学习成本很低,也有助于减小其本身的大小(其包含所有标准库的 Linux 64 位版本仅有 220 KB)
      • 高效:Lua 语言的实现极为高效。独立的性能测试说明 Lua 语言是脚本语言中最快的语言之一
      • 可移植:Lua 语言可以运行在我们昕说过的几乎所有平台之上, 包括所有的 UNIX 操作系统(Linux FreeBSD等)、 Window、Android、iOS、OS X、IBM大型机、游戏终端( PlayStation、Xbox、Wii 等) 、微处理器(如 Arduino )等、针对所有这些平台的 源码本质上是一样的, Lua 语言遵循 ANSI(ISO)C标准,并未使用条件编译来对不同平台进行代码的适配。因此,当需要适配新平台时,只要使用对应平台下的 ISO C 编译器重新编译 Lua 语言的源码就可以了
    • Lua官网:http://www.lua.org/

    二、Lua解释器的安装

    • Lua解释器是用来运行Lua程序的,此处我们以ubuntu为例,来安装Lua解释器
    • 可以到http://www.lua.org/ftp/中下载最新的Lua版本(此处我们以Lua 5.4.0为例)

    安装过程

    • 第一步:下载Lua源码包,并进入目录
    wget http://www.lua.org/ftp/lua-5.4.0.tar.gz

    • 第二步:解压源码包,并进入目录
    tar zxf lua-5.4.0.tar.gz
    
    cd lua-5.4.0/
    
    ls

    • 第三步:编译
    make linux test

    • 第四步:之后会在src目录下生成两个可执行程序lua和luac
    ls src/

    • 第五步:安装Lua
    sudo make install

    • 安装完成之后:
      • 头文件保存在/usr/local/include/目录下
      • 可执行程序保存在/usr/local/bin/目录下
      • 动态库安装在/usr/local/lib/目录下
      • 还有一些内容也安装在/usr/l;ocal目录下
    ls /usr/local/include/lua*
    
    ls /usr/local/bin/lua*
    
    ls /usr/local/lib/liblua*

    • 第六步:刷新动态库链接
    sudo ldconfig

    • 第七步:查看lua安装的版本
    lua -v

    三、运行两个lua程序案例

    演示案例1

    • 建立一个hello.lua文件,内容如下:
    print("Hello World")
    • 运行效果如下:

    演示案例2

    • 下面的fact.lua程序用来求一个数的阶乘结果:
    -- 定义一个计算阶乘的函数
    function fact(n)
        if n == 0 then
            return 1
        else
            return fact(n-1) * n
        end
    end
    
    print("enter a number:")
    
    -- 读取一个数字
    a = io.read("*n") 
    
    -- 打印结果
    print(fact(a))
    •  运行效果如下:

    四、程序段

    • 我们将Lua语言执行的每一段代码(例如,一个文件或交互模式下的一行)称为一个程序段(Chunk),即一组命令或表达式组成的序列
    • 程序段既可以简单到只由一句表达式构成,也可以由多句表达式和函数定义(实际是赋值表达式)组成(例如计算阶乘的演示案例)
    • 程序段在大小上并没有限制,事实上,由于Lua语言也可以被用作数据定义语言,所以几MB的程序段也很常见。Lua语言的解释器可以支持非常大的程序段

    五、交互式解释器

    • 除了将源码保存为文件,然后使用lua运行之外,还可以使用交互式模式的独立解释器

    进入交互式解释器

    • 在命令行下直接输入lua即可进入

    • 进入之后输入的每一条命令都会在按下回车键之后立即执行
    • 例如,我们输入下面的语句

    退出交互式解释器

    • 有两种方式退出交互式解释器:

      • 输入EOF控制符(POSIX下为ctrl+D、Windows下为ctrl+Z)

      • 或者调用操作系统的exit函数(执行os.exit())退出

    • 例如,在Linux下输入ctrl+D退出:

    • 或者执行os.exit()退出

    • 更多关于lua交互式的使用,见下面完整介绍

    六、Lua解释器完整介绍

    • 下面列出了lua解释器的参数选项:
      • 所有参数都是可选的
      • 当不使用任何参数调用lua时,就进入了上面的交互式模式

    交互式Lua

    • 当不使用任何参数调用lua时,就进入了上面的交互式模式
    • 在上面已经介绍了

    Lua脚本

    • lua解释器默认安装在/usr/local/bin/目录下,如下所示:

    • 因此,当一个脚本的开头以"#!/usr/local/bin/lua"开始时,这是一个lua的脚本,这个脚本中可以执行lua程序
    • 下面是一个名为lua_test.sh的脚本,内容如下:
    #!/usr/local/bin/lua
    
    print("HelloWorld")
    • 赋予其可执行权限,并运行:
    chmod +x lua_test.sh
    
    ./lua_test.sh

    与老版本中的兼容

    • 从Lua 5.3版本开始,可以直接在交互式模式下输入表达式,Lua语言会输出表达式的值,例如
    math.pi/4
    
    a = 15
    
    a ^ 2
    
    a + 2

    • 但是,在Lua 5.3之前,需要在表达式前面加上一个“=”号
    a = 15
    
    = a ^ 2
    
    = a + 2

    • 为了向下兼容,Lua 5.3之后的版本还是支持之前的语法

    -e选项

    • 该选项允许我们直接在命令行中输入代码
    • 备注:在POSIX系统下需要使用双引号,以防止Shell错误地解析括号
    • 例如:
    lua -e "print(math.sin(12))"

    -i选项

    • -i选项可以让Lua解释器在执行完指定的程序段之后再进入交互模式
    • 这一选项对于调试和手工测试很有用
    • 例如,下面是一个prog.lua程序
    print("Hello World")
    
    a = 15
    • 现在我们输入下面的命令,让其执行完prog.lua程序再进入交互模式:
    lua -i prog.lua
    • 可以看到其打印了“Hello World”,然后打印a,可以看到a为15

    -l选项

    • 该选项用于加载库之后再进入交互式模式,与-i选项有点类似
    • 例如,下面的命令先加载lib库,然后再执行x=10的赋值语句,并最终进入交互模式,进入之后打印x可以看到我10
    lua -i -llib -e "x=10"

    dofile()函数

    • 进入交互式解释器之后,可以调用dofile()函数加载一个外部已经存在的lua文件
    • 该函数在开发阶段也很有用。我们可以同时打开两个窗口,一个窗口使用文件编辑器编辑的代码(例如prog.lua),另一个窗口中使用交互式模式运行Lua语言解释器。当修改完代码并保存后,只要在Lua语言交互模式的提示符下执行dofile("prog.lua")就可以加载新代码
    • 例如,下面有一个lib.lua文件,内容如下:
    -- 定义了两个函数
    
    function norm(x, y)
        return math.sqrt(x^2 + y^2)
    end
    
    function twice(x)
        return 2.0*x
    end
    • 我们进入交互式解释器,然后在里面调用dofile()函数让其加载lib.lua文件的所有内容,之后就可以调用里面的函数了

    ;的使用

    • 如果执行一行语句之后,在末尾加上了分号(;),那么这条语句的输出不会被打印,但是这条命令被执行了
    • 例如:输入io.flush()默认会输出"true",可以在末尾加上;让其不打印消息

    • 即使不打印消息,但是这条语句也是被执行了的

    LUA_INIT_5_4、LUA_INIT环境变量

    • lua解释器在处理参数前,会先查找系统中名为LUA_INIT_5_4环境变量(根据你Lua的版本而定,我的lua版本为5.4),如果查找不到再去查找LUA_INIT环境变量
    • 如果这两个环境变量中的任意一个存在,如果:
      • 这两个环境变量的内容为@filename,那么lua解释器就会运行这个文件
      • 这两个环境变量的内容不是以@开头的,那么解释器就会认为这两个环境变量包含的是lua代码,会对其进行解释执行
    • 这些环境变量使得我们可以灵活的配置独立解释器。例如,我们可以预先加载程序包(Package)、修改路径、定义自定义函数、对函数进行重命名或删除函数等等

    lua解释器的程序参数

    • lua在运行代码前会创建一个名为arg的表,这个表存储了所有的命令行参数。你可以把它想象为C语言中main函数的argv数组
    • Lua语言也支持可变长参数,可以通过可变长参数表达式来获取,在脚本文件中,表达式...表示传递给脚本的所有参数(这些内容在后面介绍“可变长参数”的时候再介绍)
    • 例如,下面我们需要调用lua来执行script脚本,并且给该脚本传入了3个参数a、b、c,那么
      • arg[0]=script、arg[1]=a、arg[2]=b、arg[3]=c
    lua script a b c
    • 位于脚本之前的所有选项位于负数索引上,例如:
      • arg[-3]=lua、arg[-2]=-e、arg[-1]=sin=mayj.sin、arg[0]=script、arg[1]=a、arg[2]=b、arg[3]=c
    lua -e "sin=math.sin" script a b c
    展开全文
  • Lua 语言入门

    2017-06-27 19:59:28
    Lua 语言的基本入门
  • Lua语言从入门到精通

    2021-06-09 00:45:52
    深入浅出Lua学习
  • lua-language-server:Lua编码的Lua语言服务器
  • lua-intf是 C++11 和 Lua 语言之间的绑定,它在一个包中提供了三套不同的 API: LuaBinding , 将 C++ 类或函数导出到 Lua 脚本 LuaRef ,访问 Lua 对象的高级 API LuaState ,作为 Lua C API 的简单包装器的低级 ...
  • 超级详细的Lua语言的基础教程

    千次阅读 多人点赞 2021-04-22 16:19:46
    lua 是动态类型语言,变量不需要类型定义,可直接赋值。 值可以存储在变量中,作为参数传递或结果返回。lua 中有 8 个基本类型分别为:nil、boolean、number、string、userdata、function、thread 和 table。 ...
  • LuaCV 是 Lua 语言的 OpenCV 库包装器。 主要目标是访问快速图像处理库到轻量级、非类型语言。 由于 CMake 项目在 OpenCV 支持的许多操作系统平台下更容易编译它。 LuaCV 正在捷克共和国布尔诺理工大学电气工程和...
  • 前两天我开通了lua语言学习专栏,虽然在掘金社区没多少小伙伴看,但是突然在知乎上了推荐,“火”了一把(一本经常胡说八道),第一次发文章在知乎上推荐的:我还是没有忍住,于是乎我开通了lua语言学习专栏!...
  • 一:Lua 语言简介 Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。 二:Lua 语言的开发者 Lua 是 巴西里约热内卢...
  • LUA语言温湿度读取

    2020-08-11 22:46:29
    LUA脚本语言驱动温湿度模块DHT12,成功读取,硬件平台:上海合宙的模块, LUA脚本语言驱动温湿度模块DHT12,成功读取,硬件平台:上海合宙的模块, LUA脚本语言驱动温湿度模块DHT12,成功读取,硬件平台:上海合宙的...
  • Lua语言的双向下推自动机 凯文·史蒂文斯(Kevin Stevens) 荣誉学院的Barrett提出的部分满足毕业要求的论文 巴雷特荣誉论文委员会于2020年5月批准: 董事严Shoshitaishvili 王若愚 亚利桑那州立大学 2020年5月 ...
  • Lua语言学习

    2015-08-18 20:28:34
    Lua语言学习 本人从网上搜集过来的 上面代码亲测有效
  • lua语言:编译成Lua的语言
  • LuaLSP 支持魔兽世界API的Lua语言服务器协议。 Sublime Text需要: : 建议的LSP设置: "c:\Users\<UserName>\AppData\Roaming\Sublime Text 3\Packages\User\LSP.sublime-settings" 用您的文件夹替换UserName或路径...
  • Lua语言教程

    2014-11-18 23:40:22
    lua脚本语言简明教程
  • lua-lsp:Lua语言服务器

    2021-02-03 15:03:15
    lua-lsp:Lua语言服务器
  • Lua语言特点

    2020-05-12 15:19:27
    一、Lua语言出现的背景 Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。 Lua 是巴西里约热内卢天主教大学...
  • LUA语言参考手册

    2015-10-23 19:52:24
    作为一个扩展式语言Lua 没有 "main" 程序的概念:它只能 嵌入 一个宿主程序中工作,这个宿主程序被称作 embedding program 或简称为 host 。宿主程序可以通过调用函数执行一小段 Lua 代码,可以读写 Lua 变量,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 63,746
精华内容 25,498
关键字:

lua语言

友情链接: Desktop.zip