一、Lua教程
- 设计目的:嵌入应用程序,从而为应用程序提供灵活的扩展和定制功能。
- 特性:
- 轻量级:标准C实现;开放源码;源码2万多行;编译后仅100多Kb。
- 可扩展:
- 其他特性:
- 支持面向过程编程和函数式编程;
- 自动内存管理;
- 语言内置模式匹配;闭包等;
- 通过闭包和table可以支持面向对象的机制:抽象数据、虚函数、继承和重载等。
- 应用场景:
- 游戏开发;
- 独立应用脚本;
- Web应用脚本;
- 扩展和数据库插件;
- 安全系统,如入侵检测系统;
二、Lua环境安装
- Linux安装:
- 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
三、Lua基本语法
- 交互式编程:类似于python的交互式命令行;
- 脚本式编程:类似于bash脚本;
- 注释:
- 单行注释:--
- 多行注释:--[[多行内容--]]
- 标示符:
- 也就是变量名的定义,与c语言相同(需要以字母或下划线开头;区分大小写)。
- 关键词:
- Lua保留关键字:
- nil、and、or、not、if、then、else、elseif、end、for、do、in、while、repeat、until、break、true、false、local、function、return
- 一般约定:
- 以下划线开头,后接大写字母的名字(如: _VERSION),为Lua内部保留使用的全局变量。
- 全局变量:
- 默认情况下,变量总是全局的。
- 使用未定义的变量不会报错,此时变量的值为nil。
四、Lua数据类型
- Lua是动态类型语言,变量不需要类型定义,只需要为变量赋值。(类似于python)
- Lua中有8个基本类型:
- nil: 表示无效值;只有nil一个值;在条件表达式中相当于false;
- boolean: 包含两个值true和false;
- number: 双精度浮点数。类似于c语言中的double;
- string: 字符串,用双引号或单引号表示;
- function: 有C或Lua编写的函数;
- userdata: 表示任意存储在变量中的C数据结构;
- thread: 表示执行的独立线路,用于执行协同程序;
- table: 关联数组;数组的索引可以是数字或者字符串;
- 可以使用type()函数测试变量或值的类型:
- type("Hello World!") --> string
- type(10.1) --> number
- type(print) --> function
- type(true) --> boolean
- type(nil) --> nil
- 各数据类型详细说明:
- nil(空):
- 表示无效值;类似于C中的void;
- 对于全局变量和table,nil相当于删除;
- boolean(布尔):
- Lua把false和nil看作“假”,其余看作“真”;
- number(数字):
- 默认为double类型,可以在luaconf.h中修改;
- string(字符串):
- 用单引号或双引号表示字符串;用两个方括号"[[]]"可以表示多行字符串;
- 在数字字符串上执行算术操作时,Lua将会自动把数字字符串转换为数字,然后再执行算术运算;
- 字符串连接使用两个点".",如: print("ab".."cd") --输出为"abcd";
- 将"#"放在字符串的前面,可以计算字符串的长度,如:print(#"abcd") --输出4;
- table(表):
- 创建:通过“构造表达式”创建,最简单的构造表达式是{};
- 索引可以是数字或字符串;
- 索引默认从1开始,不同于C中的数组。
- function(函数):
- 函数名可以赋值给其他变量;
- 可以以匿名函数的方式通过参数传递;
- thread(线程):
- Lua中,最主要的线程是协同程序(coroutine);
- 协同程序的特点:
- 拥有自己独立的栈、局部变量和指令指针;
- 可以跟协同程序共享全局变量,和其他大部分东西;
- 线程和协程的区别:
- 线程可以同时运行多个,而协程在任意时刻只能运行一个;
- 处于运行状态的协程只有被挂起时才会暂停;
- userdata(自定义类型):
- 可以将任意C/C++的任意数据类型的数据(通常是struct和指针)存储到Lua变量中。
五、Lua变量
- Lua变量有三种类型:全局变量、局部变量和表中的域;
- 局部变量:
- 使用local显示声明;
- 作用域为声明位置开始到语句块结尾结束;
- 全局变量:
- 哪怕在语句块或函数中,只要没有使用local显示声明,都是全局变量;
- 赋值语句:
- 可以多个变量同时赋值:
- 示例:a, b, c = 1, 2, 3
- x,y = y, x --相当于交换x和y的值;
- 变量个数与值的个数不一致时:
- 变量个数大于值的个数时,按变量个数补nil。
- 变量个数小于值的个数时,忽略多余的值。
- 最好使用局部变量,好处:
- 避免命名冲突;
- 访问局部变量的速度比全局变量快;
- 索引:
- 对table的索引使用方括号"[]",示例:tt['key'];
- 当索引为字符串类型时,也可以使用点号".",示例:tt.key;