一、Lua教程

  1. 设计目的:嵌入应用程序,从而为应用程序提供灵活的扩展和定制功能。
  2. 特性:
  1. 轻量级:标准C实现;开放源码;源码2万多行;编译后仅100多Kb。
  2. 可扩展:
  3. 其他特性:
  1. 支持面向过程编程和函数式编程;
  2. 自动内存管理;
  3. 语言内置模式匹配;闭包等;
  4. 通过闭包和table可以支持面向对象的机制:抽象数据、虚函数、继承和重载等。
  1. 应用场景:
  1. 游戏开发;
  2. 独立应用脚本;
  3. Web应用脚本;
  4. 扩展和数据库插件;
  5. 安全系统,如入侵检测系统;

二、Lua环境安装

  1. Linux安装:
  1. curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gz
  2. tar zxf lua-5.3.0.tar.gz
  3. cd lua-5.3.0
  4. make linux test
  5. make install

三、Lua基本语法

  1. 交互式编程:类似于python的交互式命令行;
  2. 脚本式编程:类似于bash脚本;
  3. 注释:
  1. 单行注释:--
  2. 多行注释:--[[多行内容--]]
  1. 标示符:
  1. 也就是变量名的定义,与c语言相同(需要以字母或下划线开头;区分大小写)。
  1. 关键词:
  1. Lua保留关键字:
  1. nil、and、or、not、if、then、else、elseif、end、for、do、in、while、repeat、until、break、true、false、local、function、return
  1. 一般约定:
  1. 以下划线开头,后接大写字母的名字(如: _VERSION),为Lua内部保留使用的全局变量。
  1. 全局变量:
  1. 默认情况下,变量总是全局的。
  2. 使用未定义的变量不会报错,此时变量的值为nil。

四、Lua数据类型

  1. Lua是动态类型语言,变量不需要类型定义,只需要为变量赋值。(类似于python)
  2. Lua中有8个基本类型:
  1. nil: 表示无效值;只有nil一个值;在条件表达式中相当于false;
  2. boolean: 包含两个值true和false;
  3. number: 双精度浮点数。类似于c语言中的double;
  4. string: 字符串,用双引号或单引号表示;
  5. function: 有C或Lua编写的函数;
  6. userdata: 表示任意存储在变量中的C数据结构;
  7. thread: 表示执行的独立线路,用于执行协同程序;
  8. table: 关联数组;数组的索引可以是数字或者字符串;
  1. 可以使用type()函数测试变量或值的类型:
  1. type("Hello World!")  --> string
  2. type(10.1)                  --> number
  3. type(print)                 --> function
  4. type(true)                  --> boolean
  5. type(nil)                     --> nil
  1. 各数据类型详细说明:
  1. nil(空):
  1. 表示无效值;类似于C中的void;
  2. 对于全局变量和table,nil相当于删除;
  1. boolean(布尔):
  1. Lua把false和nil看作“假”,其余看作“真”;
  1. number(数字):
  1. 默认为double类型,可以在luaconf.h中修改;
  1. string(字符串):
  1. 用单引号或双引号表示字符串;用两个方括号"[[]]"可以表示多行字符串;
  2. 在数字字符串上执行算术操作时,Lua将会自动把数字字符串转换为数字,然后再执行算术运算;
  3. 字符串连接使用两个点".",如: print("ab".."cd") --输出为"abcd";
  4. 将"#"放在字符串的前面,可以计算字符串的长度,如:print(#"abcd") --输出4;
  1. table(表):
  1. 创建:通过“构造表达式”创建,最简单的构造表达式是{};
  2. 索引可以是数字或字符串;
  3. 索引默认从1开始,不同于C中的数组。
  1. function(函数):
  1. 函数名可以赋值给其他变量;
  2. 可以以匿名函数的方式通过参数传递;
  1. thread(线程):
  1. Lua中,最主要的线程是协同程序(coroutine);
  2. 协同程序的特点:
  1. 拥有自己独立的栈、局部变量和指令指针;
  2. 可以跟协同程序共享全局变量,和其他大部分东西;
  1. 线程和协程的区别:
  1. 线程可以同时运行多个,而协程在任意时刻只能运行一个;
  2. 处于运行状态的协程只有被挂起时才会暂停;
  1. userdata(自定义类型):
  1. 可以将任意C/C++的任意数据类型的数据(通常是struct和指针)存储到Lua变量中。

五、Lua变量

  1. Lua变量有三种类型:全局变量、局部变量和表中的域;
  1. 局部变量:
  1. 使用local显示声明;
  2. 作用域为声明位置开始到语句块结尾结束;
  1. 全局变量:
  1. 哪怕在语句块或函数中,只要没有使用local显示声明,都是全局变量;
  1. 赋值语句:
  1. 可以多个变量同时赋值:
  1. 示例:a, b, c = 1, 2, 3
  1. x,y = y, x --相当于交换x和y的值;
  2. 变量个数与值的个数不一致时:
  1. 变量个数大于值的个数时,按变量个数补nil。
  2. 变量个数小于值的个数时,忽略多余的值。
  1. 最好使用局部变量,好处:
  1. 避免命名冲突;
  2. 访问局部变量的速度比全局变量快;
  1. 索引:
  1. 对table的索引使用方括号"[]",示例:tt['key'];
  2. 当索引为字符串类型时,也可以使用点号".",示例:tt.key;