由于想了解一下 OpenResty, 先看看 Lua 的语法。
Lua 是啥
- 开源
- 嵌入式
- 脚本语言引擎 (由标准 C 编写,非常容易和 C/C++ 相互调用)
- 语法简单
- 没有强大的标准库
我的理解是,给 C 项目嵌入 lua 语言支持,然后通过 lua 来实现上层业务逻辑的快速开发,或者系统的灵活拓展。
除了官方 Lua 之外,还有这两个实现:
LuaJIT
OpenResty 当前采用的就是这个玩意(之前是标准 Lua) 重点!Lupa
Python 模块,实现了对 Lua 脚本的解析
安装
sudo apt install -y lua5.4
命令行输入 lua
可以启动一个交互 SHELL。
语法
- 不像 Python 用缩进区分代码段,也不像 C 用花括号,而是用
end
; - 约定:下划线打头的大写字母组成的标识符作为 Lua 内部全局变量
关键字
and or
do while for repeat until break
if then else elseif end
true false nil
function return
in
local
goto
数据类型
nil
boolean
number
:1
,1.1
,1e2
string
单引号,双引号,或[[
+]]
table
数组(和 PHP 类似)userdata
C 语言结构function
函数被视为一种数据结构thread
-- type 返回字符串
type(a) -- nil
字符串
- 字符串连接:
..
- 计算长度:一元操作符
#
,也用于计算数组长度
常见操作
string.upper
,string.lower
,string.reverse
,string.len
string.format
- 模式匹配:
string.match
string.gmatch
string.sub
string.gsub(mainString, findString, replaceString, num)
string.find(str, substr, )
string.rep(str, n)
重复string.char(arg)
,string.byte(arg[,int])
整形和字符的转换
数组
- 除了
nil
之外的所有值都可以用作索引 - 方括号,和小数点取值都支持
小数点取值的话,要求必须是合法标识符
常见操作
table.concat(table[, sep[, start[, end]]])
jointable.insert(table[, pos], value)
table.remove(table[, pos])
table.sort(table[, comp])
类型转换
数字 字符串
变量
- 默认为全局变量(和 Python 类似)
- 本地变量需要用 local 声明
- 没有初始化的变量为
nil
- 删除变量:
x = nil
,删除数组中的元素也是赋值nil
函数
function average(...)
result = 0
local arg = {...}
for i, v in ipairs(arg) do
result = result + v
end
print("总共传入 " .. select("#",...) .. " 个数")
return result / select("#", ...)
end
- 三个点
...
表示可变参数,固定参数需要放到可变参数前面select('#', ...)
可变参数长度select(n, ...)
可变参数切片
异常处理
assert
error(message[, level]) -- 相当于抛出异常
-- level 0, 1, 2 分别表示没有附加信息,错误位置(文件 + 行号),调用函数
pcall(func, ...) -- 调用函数,返回是否有错误(boolean),错误信息
xpcall(func, error_callback, ...) -- 增加了异常处理
debug 模块
这里面有好多内容。
debug.debug -- 进入交互模式
debug.trackback -- 调用栈
其他
- lua 会先计算左值,再赋值,所以支持和 Python 一样的
a, b = b, a
这种变量交换。 - 注释:
- 单行
--
- 多行
--[[
]]
- 单行
- 逻辑运算中不等于:
~=
,不是常见的!=
,需要注意 - 自动垃圾回收,手动的话调用
collectgarbage