lua 入门(1)

在正式开始学习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)