Kong网关:入门、实战与进阶
上QQ阅读APP看书,第一时间看更新

3.5 Lua库

Lua库是利用C语言API实现的,提供了丰富的函数。其既可在库文件内部使用,也可以供外部调用。Lua库分为基础库(Basic library)、协程库(Coroutine Library)、包管理库(Package Library)、字符串控制(String Manipulation)、基础UTF-8支持(Basic UTF-8 Support)、表控制(Table Manipulation)、数学函数(Mathematical Function)、输入/输出(Input and Output)、操作系统处理(Operating System Facility)、调试工具(Debug Facility)。下面展示使用表控制中的table.sort方法对表进行排序。


> animal = {"lion","alpaca","panda","tiger","wolf"}
> table.sort(animal)  -- 按照首字母顺序排序
> for k,v in ipairs (animal) do
>> print (k, v)
>> end
1   alpaca
2   lion
3   panda
4   tiger
5   wolf

下面介绍一些常用的库及其对应的方法。

1.基础库

基础库提供了不少Lua核心方法。该库包含的方法详情如表3-7所示。

表3-7 基础库方法

2.I/O库

I/O库对文件的操作包含两种风格,一种是基于文件句柄,对应的方法详情如表3-8所示;另一种是基于当前操作的文件,对应的方法详情如表3-9所示。

表3-8 I/O库方法:基于文件句柄的方法

表3-9 I/O库方法:基于当前操作的文件的方法

代码清单3-11和代码清单3-12利用I/O库方法实现了相同的功能:文件复制,但是使用了不同的实现风格。读者可以比较这两种实现的异同点,以便更好地理解I/O库方法。

程序清单3-11 I/O库代码示例:基于文件句柄的方法


> function copy(src, dst)
>>   local src_file = io.input(src)
>>   if not src_file then
>>     print(src.."不存在")
>>     return
>>   end
>>   local str = io.read("*a")
>>   local dst_file = io.output(dst)
>>   io.write(str)
>>   io.flush()
>>   io.close()
>> end
> copy("lua.lua","lua.bak")

程序清单3-12 I/O库代码示例:基于当前操作的文件的方法


> function copy(src, dst)
>>   local src_file, err = io.open(src,"r")
>>   if not src_file then
>>     return false, err
>>   end
>>   local content = src_file:read("*a")
>>   src_file:close()
>>   local dst_file, err = io.open(dst, "w")
>>   if not dst_file then
>>     return false, err
>>   end
>>   dst_file:write(content)
>>   dst_file:close()
>>   return true
>> end
> copy("lua.lua","lua.bak")
true

3.表库

表库提供了处理表的通用方法,包括从表(List)中插入、删除元素的方法以及对数组(Array)元素排序的方法。如果需要对表进行取长操作,那么表必须是一个真序列或者拥有__len元方法。表库方法详情如表3-10所示。

表3-10 表库方法

4.字符串库

字符串库提供了处理字符串的通用方法,包括字符串查找,子串、模式匹配等方法。当在Lua中对字符串做索引时,第一个字符从1开始计算。索引可以是负数,指从字符串末尾反向解析,即最后一个字符的位置为-1,依次类推。

字符串库中的所有方法都在字符串表中。它还将其设置为字符串元表的__index域。因此,用户可以以面向对象的形式使用字符串方法。例如,string.byte(s,i)可以写成s:byte(i)。字符串库方法详情如表3-11所示。

表3-11 字符串库方法