一、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;
-