在正式开始学习kong插件之前我觉得有必要系统的学习一下lua
这种小巧的胶水语言似乎在游戏脚本领域混得不错, 不过对于我这种企业应用程序员来说似乎没什么吸引力, 不过好在它确实挺容易学的
首先是安装, 从源码编译很方便的, 不用什么rpm包, 而且实际上centos7本身自带了5.1版本的lua
首先准备编译环境
yum -y install gcc automake autoconf libtool make
yum install readline-devel
然后下载源码包
http://www.lua.org/download.html
tar zxf lua-5.3.5.tar.gz
cd lua-5.3.5
进行编译安装
make linux test
make install
这个时候如果你查看lua版本 lua -v 出现还是5.1版本, 是因为/usr/bin目录下的旧版本文件没有被替换, 去搞个软连接就ok了
cd /usr/bin
mv lua lua.bak
mv luac luac.bak
ln -s /usr/local/bin/lua /usr/bin/lua
ln -s /usr/local/bin/luac /usr/bin/luac
[root@localhost bin]# lua -vLua 5.3.5 Copyright (C) 1994-2018 Lua.org, PUC-Rio[root@localhost bin]# |
helloworld

带函数的版本

lua用nil表示空值
全局变量
在lua语言中, 全局变量无需声明即可使用, 使用未经初始化的全局变量不会报错, 得到的结果是nil
当把nil赋值给全局变量时, lua会回收该全局变量
类型和值
lua是动态类型语言, 在这种语言中, 不需要在创建变量的时候声明类型, 例如c语言, 当你使用 int a 声明一个新变量时, a 就被固定成了int , 并在内存中开辟了一个”int” 空间
lua中int这个type信息是保存在a自己的数据结构当中的, a 自己知道自己是一个 int
调用参数
参数可以通过全局变量 arg 来获得, 它是一个列表, 索引的0号位置保存的是脚本名称
lua -e “test=hello” helloworld.lua a b
arg[-3] = “lua”
arg[-2] = “-e”
arg[-1] = “test=hello”
arg[0] = “helloworld.lua”
arg[1] = “a”
arg[2] = “b”
字符串整型数那些这里就不写了,数据类型这我重点来说说 Table
Table 是lua语言中最主要, 也是唯一的一种强大的数据结构. 它可以表示数组, 集合, 记录和其他复杂结构.
lua语言也使用table来表示包和对象的从属关系, 例如 math.sin , 你可能会认为是调用了math包下的sin函数, 实际上是在math表中, sin字符串索引指向的函数
lua语言不会对表进行深克隆
a = {} — 创建一个表
value = “x” — 声明了一个字符串value, 值是x
a[value] = 10 — 这句等价于 a[“x”] = 10
当把表当成结构体使用时, 可以把索引当做成为变量的名称使用
a[“x”] = 10 等价于 a.x = 10
需要一个数组时可以使用整型数作为索引 例如 a[1] , a[2] …
遍历表
使用paris遍历表中的键值对无法保证一定是按照固定顺序的, 但是可以保证每个元素只被读取一次

如果只是数组形式的话可以使用ipairs来遍历, 此时可以保证输出顺序

数组形式还可以用和c语言类似的方式

关于安全访问
mytable = {
x = 1,
y = 2,
z = 3,
a = {
b = 2
},
}
if mytable~=nil
then
if mytable.a~=nil
then
if mytable.a.b~=nil
then
print(mytable.a.b)
end
end
end
value1 = mytable and mytable.a and mytable.a.b;
print(value1)
value2 = ((mytable or {}).a or {}).b
print(value2)
