介绍:
是一种轻量级的脚本语言,使用C语言编写,并是开源项目,设计的目的是为了嵌入应用程序中,从而为已有的应用程序提供灵活的拓展和定制功能
特性
- 支持面向过程(procedure-oriented)编程和函数式编程(functional programming);
- 自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象;
- 语言内置模式匹配;闭包(closure);函数也可以看做一个值;提供多线程(协同进程,并非操作系统所支持的线程)支持;
- 通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,虚函数,继承和重载等。
应用场景
- 游戏相关的开发
- 独立应用脚本
- Web 应用脚本
- 扩展和数据库插件如:MySQL Proxy 和 MySQL WorkBench
- 安全系统,如入侵检测系统
- redis中嵌套调用实现类似事务的功能,redis也支持lua脚本
- web容器中应用处理一些过滤 缓存等等的逻辑,例如nginx。
安装Lua
1、下载安装包
[root@localhost home]# curl -R -O http://www.lua.org/ftp/lua-5.3.5.tar.gz % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 296k 100 296k 0 0 7308 0 0:00:41 0:00:41 --:--:-- 82632、解压
[root@localhost home]# tar zxf lua-5.3.5.tar.gz3、安装插件
[root@localhost home]# yum install libtermcap-devel ncurses-devel libevent-devel readline-devel4、进入解压包进行编译安装
[root@localhost lua-5.3.5]# make linux test5、检验是否安装成功
[root@localhost lua-5.3.5]# lua Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio >
入门操作
万物皆可hello world
1、创建hw.lua文件,并打印内容
[root@localhost lua-5.3.5]# vi hw.lua print("hello world");2、执行lua命令
[root@localhost lua-5.3.5]# lua hw.lua hello world
Lua语法介绍
1、交互式编程
lua提供了交互式编程模式,即进入命令客户端就可以直接看到效果,首先使用lua或lua -i进入客户端,并且输入print进行打印即可,效果如图:
![]()
2、脚本式编程
lua提供了脚本式的编程,即我们可以将lua程序代码写在以lua为后缀的文件中并执行这个文件,比如上面“入门操作”中的操作案例一样,那接下来我们看一下我们怎么去写这个脚本式
2.1、注释
- --:单行注释
- --[[...]]:多行注释
3、声明变量
默认情况下,声明的每一个变量都是全局变量,如果需要局部/成员变量就需要加上一个local关键字即可,如图
需要注意的时,如果调用的变量没有或者没有初始值,就会和redis客户端一样,返回一个nil,而不是null
4、数据类型
数据类型 描述 nil 只要是返回nil都属于该数据类型,它标识一个无效值,在条件表达式中表示false boolean 布尔值,和java一样,只有true/false number 表示双精度的实浮点数 string 字符串,和java不同的地方是它可以用单引号或者双引号 function 由C或Lua编写的函数 userdata 表示任意存储在变量中的C数据结构 thread 标识执行的独立线程,用于执行协同程序 table Lua 中的table,相当于mysql中的表,它其实是一个“关联数组”(associative arrays),数组的索引可以是数字、字符串或表类型。在 Lua 里,table 的创建是通过“构造表达式”来完成,最简单构造表达式是{},用来创建一个空表。 具体用法,我们用命令看一下:
5、流程控制
2.5.1、if语句
语法:
if(布尔表达式) then --[ 在布尔表达式为 true 时执行的语句 --] end效果如图:
2.5.2、if..else
语法:
if(布尔表达式) then --[ 布尔表达式为 true 时执行该语句块 --] else --[ 布尔表达式为 false 时执行该语句块 --] end效果如图:
6、while循环
语法:
while(condition) do --[需要循环的逻辑代码] end效果如图:
7、for循环
语法:
for var=exp1,exp2,exp3 do --[需要循环的代码逻辑] end跟java的for进行相比,for(int i=0;i<=10,i++),上面的语法中exp1相当于int i=0,给予变量起始值,exp2相当于i<=10,给定循环条件,exp3相当于i++,表示每次循环之后的自增步长
效果如图:
循环一个初始值为1,每次循环i就加1,一直循环到i=10位置
8、repeat..until循环
特别说明:repeat..until也是循环,但是和while和for循环还有所不同,for和while循环的条件语句是在当前循环执行前进行判断,只有在条件满足之后才能进入循环体执行逻辑,而repeat..until循环的条件语句是在当前循环执行完之后判断的
语法:
repeat --[需要循环的代码逻辑] until( condition )效果如图:
可能看着效果图,再加上上面对区别for和while的讲解一块来看,可能会迷糊,那我们来讲解一下:首先我们先定一个变量num,初始值是1,在使用repeat语句的时候,它没有条件判断,num是直接进入repeat方法体,直接打印了1,然后+1,此时num=2,那这个时候,这个循环需要判断有没有必要再循环打印num,就会判断num>10不?此时num=2,肯定不大于10,所以会继续循环,以此类推~
9、function函数
语法:
function 函数名(参数) --[执行逻辑代码] end比较最大值,效果如图:
![]()
10、表
lua中的table是一种数据结构,是用来帮我们创建不同数据类型的,比如数组、字典等等,也可以解决模块、包、对象
10.1、模块
10.1.1、模块定义
创建一个module.lua文件,写入以下代码:
-- 定义一个名为 module 的模块 module = {} -- 定义一个常量 module.constant = "这是一个module中的常量" -- 定义一个函数 function module.func1() print("这是一个公有函数") end local function func2() print("这是一个私有函数!") end function module.func3() func2() end return module10.1.2、require函数
作用是引入其他的模块,相当于java中调用其他的类
语法:
require("模块名/变量")我们创建一个test_module.lua的文件,其中的代码我们写:
[root@localhost lua-5.3.5]# vi test_module.lua --调用某一个模块,使用引号来引用模块名即可 require("module") --调用某个模块下的常量 print(module.constant) --调用某个模块下的函数 module.func3()我们调用10.1.1中的变量和方法,效果如图:








