菜鸟教程上学习Lua教程后整理的一些笔记,完整教程请点击链接

设计目的

其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

特性

  • 内嵌性
  • 轻量级
  • 可扩展

基本语法

注释

  • 单行注释
--
  • 多行注释
--[[
 多行注释
 多行注释
 --]]

标识符(变量)

一个字母 A 到 Z 或 a 到 z 或下划线 _ 开头后加上0个或多个字母,下划线,数字(0到9)。

全局变量

  • 默认情况下变量为全局
  • 访问一个没经过初始化的全局变量,得到为nil
  • 将变量赋值为nil即删除该全局变量

数据类型

数据类型 描述
nil 只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)
boolean 包含两个值:false和true
number 表示双精度类型的实浮点数
string 字符串由一对双引号或单引号来表示
function 由 C 或 Lua 编写的函数
userdata 表示任意存储在变量中的C数据结构
thread 表示执行的独立线路,用于执行协同程序
table Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字或者是字符串。在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表

注: type函数可以测试给定变量或值的类型

变量

  • Lua 变量有三种类型:全局变量、局部变量、表中的域。
  • Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量。
  • 局部变量的作用域为从声明位置开始到所在语句块结束
  • 变量的默认值均为 nil

赋值语句

  • lua可对多个变量进行赋值,例a, b = 10, 2*x
  • 赋值语句Lua会先计算右边所有的值然后再执行赋值操作,故可以这样交换变量的值,x, y = y, x
  • 当变量个数和值的个数不一致时,Lua会一直以变量个数为基础采取以下策略:

补充说明:

当变量个数 > 值的个数时,按变量个数补足nil 当变量个数 < 值的个数时,多余的值会被忽略

索引

对 table 的索引使用方括号 []

Lua循环

支持三种循环方式,有do...whileforrepeat...until,另外支持break跳出当前循环

流程控制

判断的格式如下:

if(0)
then
    print("0 为 true")
end

函数

通用格式如下:

optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)
   function_body
   return result_params_comma_separated
end

运算符

算术运算符

操作符 描述
+ 加法
- 减法
* 乘法
/ 除法
% 取余
^ 乘幂
- 负号

关系运算符

操作符 描述
== 是否相等
~= 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于

逻辑运算符

操作符 描述
and
or
not

其他运算符

操作符 描述
.. 字符串连接
# 一元运算符,返回字符串或表的长度

运算符优先级

从高到低如下所示:

^
not    - (unary)
*      /
+      -
..
<      >      <=     >=     ~=     ==
and
or

注: 除了^和..外所有的二元运算符都是左连接的

字符串

字符串操作

函数 作用
string.upper(argument) 字符串全部转为大写字母
string.lower(argument) 字符串全部转为小写字母
string.gsub(mainString,findString,replaceString,num) 在字符串中替换,mainString为要替换的字符串, findString 为被替换的字符,replaceString 要替换的字符,num 替换次数(可以忽略,则全部替换)
string.find (str, substr, [init, [end]]) 在一个指定的目标字符串中搜索指定的内容(第三个参数为索引),返回其具体位置。不存在则返回 nil

数组

一维数组:

array = {"Lua", "Tutorial"}

for i= 0, 2 do
   print(array[i])
end

多维数组:

-- 初始化数组
array = {}
for i=1,3 do
   array[i] = {}
      for j=1,3 do
         array[i][j] = i*j
      end
end

-- 访问数组
for i=1,3 do
   for j=1,3 do
      print(array[i][j])
   end
end

模块与包

require函数

require的函数用来加载模块,如下:

-- test_module.lua 文件
-- module 模块为上文提到到 module.lua
require("module")

print(module.constant)

module.func3()