Lua基础入门
Lua是一种轻量、小巧的脚本语言,用标准C语言编写并以源代码形式开放。其设计目的是嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。目前Lua大量应用于Nginx、嵌入式设备、游戏逻辑开发等方面。
在Nginx中,Lua中的例程机制可以很好地和Nginx的全异步、非阻塞的多阶段处理机制结合,使开发者使用同步的模式,开发全异步的应用,而不用考虑异步的处理机制。
Lua基础
推荐读者在自己的计算机上安装一个Lua开发环境,因为Lua是解释型脚本语言,可以一行一行地调试,便于快速理解。
Lua的特性
相较于其他语言、其他脚本语言,Lua有其自身的特点。
- 轻量级:Lua用标准C语言编写并以源代码形式开放,编译后仅仅一百余千字节,可以很方便地嵌入其他程序中。
- 可扩展:Lua提供了非常易于使用的扩展接口和机制,由宿主语言(通常是C或C++)提供功能,Lua可以使用它们,就像内置的功能一样。
- 其他特性:
- 支持面向过程编程和函数式编程。
- 自动内存管理:只提供了一种通用类型的表(table),用它可以实现数组、hash表、集合、对象。
- 语言内置模式匹配:①闭包(closure);②函数也可以看作一个值;③提供多线程(协同进程,简称协程,并非操作系统所支持的线程)支持。
- 通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,如数据抽象、虚函数、继承和重载等。
Lua的应用场景
Lua在不同的系统中得到了大量应用,常见的应用场景如下。
- 游戏开发:在游戏开发中,游戏的逻辑因为需要经常修改,所以游戏设计了一个模式,将游戏的操作收集和显示放在客户端,逻辑放在后端服务器上。在服务器上使用Lua脚本实现,这样当游戏规则修改或游戏规模变大而要修改逻辑时可以不用升级游戏客户端,而且在服务端修改起来也很简单。
- 独立应用脚本:Lua的语法类似于C和C++,支持常用的系统库,可以编写简单的独立小程序,如一些纯数学计算应用、类似于Shell的复杂脚本。
- Web应用脚本:使用Lua实现CGI应用。CGI接口简单,使用CGI的应用程序对HTTP请求参数进行处理,将参数与数据库建立关系,然后返回格式化的数据。可以在这种场景下使用Lua进行字符串处理和数据格式化操作。
- 扩展和数据库插件,如使用在MySQL的Proxy里。Proxy的工作是根据配置做调写分离调度,同时实现数据同步操作。是纯粹的业务逻辑,与磁盘的高速交互由对应的引擎处理。这种纯逻辑性工作适合用Lua开发,开发速度快,修改灵活。
- 安全系统,如入侵检测系统:在WAF里,以及其他的应用层协议检测机制中,Lua可以用于做入侵规则判断。其相比于C语言的好处是规则可以动态加载,可以及时修改。不同的检测规则编写在不同的Lua文件中,根据配置调用对应的Lua文件,可以实现使用不同规则的机制。
安装Lua环境
为了运行Lua代码,可以在自己的开发环境上安装Lua,这比在Nginx上直接调试Lua要方便很多,所以推荐先使用本文讲解的工具学习Lua语法,之后再在Nginx上开始Web开发。
在Linux系统上安装Lua
在Linux上安装Lua非常简单,只需要下载源码包并在终端解压、编译即可,本文使用了5.3.0版本进行安装:
curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gz
tar zxf lua-5.3.0.tar.gz
cd lua-5.3.0
make linux test
make install
在Mac OS X系统上安装Lua
在Mac OS X系统执行下面命令进行安装:
curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gz
tar zxf lua-5.3.0.tar.gz
cd lua-5.3.0
make macosx test
make install
接下来创建一个HelloWorld.lua文件,代码如下:
print("Hello World!");
执行以下命令:
$ lua HelloWorld.lua
输出结果为
Hello World!
在Windows系统上安装Lua
在Windows下可以使用SciTE的集成开发环境(Integrated Development Environment,IDE)来执行Lua程序,下载地址为http://static.runoob.com/download/LuaForWindows_v5.1.4-46.exe。
GitHub下载地址:https://github.com/rjpcomputing/luaforwindows/releases。
Google Code下载地址:https://code.google.com/p/luaforwindows/downloads/list。
双击安装后即可在该环境下编写Lua程序并运行。
也可以使用Lua官方推荐的方法使用LuaDist:http://luadist.org/。
Lua基本语法
Lua与C/C++语言非常相似,大量使用了符号简化逻辑描述,所以整体上比较清晰、简洁。条件语句、循环语句、函数调用等与C/C++基本一致。
第一个Lua程序
Lua有交互式和脚本式两种编程方式,下面分别讲解。
交互式编程
Lua提供了交互式编程模式,可以在命令行中输入程序并立即查看效果。
Lua交互式编程模式可以通过命令lua-i或lua来启用:
$ lua -i
$ Lua 5.3.0 Copyright (C) 1994-2015 Lua.org, PUC-Rio
>
在命令行中,输入以下命令:
> print("Hello World!")
按下回车键,输出结果如下:
> print("Hello World!")
Hello World!
>
脚本式编程
可以将Lua代码保存到一个以lua为扩展名的文件中并执行,该模式称为脚本式编程。例如,将如下代码存储在名为hello.lua的脚本文件中:
print("Hello World!")
使用Lua执行以上脚本,输出结果为
$ lua test.lua
Hello World!
也可以将代码修改为如下形式来执行脚本(在开头添加#!/usr/local/bin/lua):
#!/usr/local/bin/lua
print("Hello World!")
以上代码中,指定了Lua解释器为/usr/local/bin。加上#号标记解释器会忽略它。接下来为脚本添加可执行权限,并执行:
chmod 777 test.lua
./test.lua
Hello World!
注释
与其他语言的注释语法一样,Lua支持两种注释方法。
- 单行注释
单行注释格式:
--注释
- 多行注释
多行注释格式:
--[[ 多行注释 多行注释 --]]
标识符
Lua标识符用于定义一个变量、函数或其他用户定义的项。标识符以一个字母(A~Z或a~z)或下划线(_)开头后加上0个或多个字母、下划线、数字(0~9)。
最好不要使用下划线加大写字母的标识符,因为Lua的保留字也是这样定义的。
Lua不允许使用特殊字符(如@、$、和%)来定义标识符。Lua是一个区分大小写的编程语言,因此在Lua中test与Test是两个不同的标识符。
以下列出了一些正确的标识符:mohd、zara、abc、move_name、a_123、myname50、_temp、j、a23b9、retVal。
关键词
保留关键字不能作为常量、变量或其他用户自定义标识符。
一般约定,以下划线开头连接一串大写字母的名字(如_VERSION)被保留用于Lua内部全局变量。
全局变量
默认情况下,变量总是被认为是全局的。 全局变量不需要声明,给一个变量赋值后即创建了这个全局变量,访问一个没有初始化的全局变量也不会出错,只不过得到的结果是nil。
>print(b)
nil
> b=10
>print(b)
10
>
如果想删除一个全局变量,只需要将变量赋值为nil。
b = nil
print(b) --> nil
这样变量b就好像从没被使用过一样。换句话说,当且仅当一个变量不等于nil时,这个变量即存在。