Lua核心提供的功能很有限,大部分功能均为通过标准库来实现。
1 数学库
三角函数
sin/cos/tan/asin/scos ...
指对数函数
exp/log/log10
取整函数
floor/ceil
max/min
随机数函数
random() 不带参数时返回0-1的随机小数,带整数参数则返回0-N的一个随机数
randomseed() 设置随机数种子
2 table库
table.insert(tbl,idx,value) 将tbl的idx位置插入value。若未指定idx参数,则在末尾插入。
table.remove(tbl,idx,value) 删除tbl的idx位置的value。默认删除最后一个元素。
table.concat(tbl,sep) 将tbl的元素拼接在一起,中间以seq分隔
table.sort(t,compf) 根据compf对t的值进行排序,默认为<函数。
下面的代码实现了一个按key的顺序迭代一个表
function keyOrderValues(t,comp)
local a = {};
for k,v in pairs(t) do
a[#a+1] = k;
end
table.sort(a,comp);
local i = 0;
return function(a,i)
i = i + 1;
return a[i],t[a[i]]
end
end
3 string库
3.1 基本函数
string.len(s) 返回字符串的长度
string.rep(s,n) 返回s重复n次的结果
string.lower(s) 转为小写,按当前的locale设置进行
string.upper(s) 转为大写
string.sub(s,start,end) 取子串
string.char(s[,start[,end]]) 返回整数n代表的字符
string.byte(b,...) 返回字符c底层的字节整数
string.byte(s,start,end) 同上
string.format("fmt",...) 按照fmt的格式来格式化字符串,格式同printf
3.2 模式匹配
string.find(s,pattern) 返回子串在父串中的开始和结尾位置,若无则返回nil
string.match(s,pattern) 返回模式在s中的匹配串,无则返回nil
string.gsub(s,patt,rep,cnt) 将匹配的串替换为rep,cnt指定替换的次数,默认为1
string.gmatch(s,pattern) 返回遍历所有指定模式的迭代器
示例:从url中获取host名分
string.match(url,"http://(.-)/")
Lua的模式介绍
字符分类
%a 字母 [a-zA-Z]
%b<x><y> 匹配在<x> <y>之间的字符
%c 控制字符
%d 数字
$l 小字母 [a-z]
%u 大写字母 [A-Z]
%p 标点
%s 空白字符
%w 字母与数字 [a-zA-z0-9]
%x 十六进制数字 [0-9a-fA-F]
%z 内容表示为0的字符
所有这些分类的大写形式表示补集的概念。
() . % + - * ? [] ^ $ 具有特殊含义。如果要匹配这些字符需要进行转义。
. 代表所有字符
[] 在集合中
[^] 不在集合中
() 用于进行分组捕获,按从外向内,由左向右进行编号。
% 转义
+ 出现1次或多次
- 出现0或多次,但只做最小匹配
? 出现0或1次
* 模式出现0或多次,做最大匹配子串
^ 模式出现在头
$ 模式出现在结尾
4 IO库
4.1 简单IO操作
简单操作所有操作都作用于标准输入和输出。
io.input(file) 设置输入文件
io.output(file) 设置输出文件
io.read(type,...) 从设置的输入中获取数据,默认为标准输入。参数决定如何读取数据
"*all" 读取整个文件
"*line" 读取下一行
"*number"读取一数字
<num> 读取不超过<num>个字符,用于进行块读取
io.write(str,...) 向设置的输出中写入数据,默认为标准输出
print(str,...) 向标准输出写入数据
io.lines() 返回输入的所有行
4.2 完整IO模型
io.open(file,mode) 打开文件,返回一个句柄,如果出错,则返回nil及出错的消息。mode有r/wb。有了文件句柄,就可以在句柄上进行操作
io.tmpfile() 返回一个临时文件句柄,以读写方式打开,程序结束后自动删除。
io.flush() 刷新缓冲中的数据
性能优化
lines,rest = io.read(BUFSIZE,"*line") 可以实现缓冲设计,另外rest部分保存被bufsize截断的行的后一段
file.seek(whence,offset) 返回设置后的文件指针偏移量
定位文件指针,whence取值有set,cur,end分别指示文件头、当前位置、文件尾,而offset指示相对于whence的偏移量。如果希望获得文件大小,则调用seek('end',0)
file.read()
file.write()
file.lines()
file.setvbuf()
file.close()
5 OS库
os.time() 返回当前时间戳,时间起点可以用table{y,m,d,h,m,s}来指定,默认格式为%c(以特定格式进行格式化)
os.date("fmt",ts) 对ts表示的时间以fmt进行格式化,如date("%Y-%m-%d %H:%M:%S",time())
os.exit()
os.getenv(key) 获取系统变量
os.execute(str) 执行系统命令,返回值为命令的输出流及返回代码
os.setlocale(value,type) 设置指定的类型的值,type默认为all,有time,numberic,monetary,collate,ctype
6 debug库
调度库中包含两类机制,一类是自省,另一类是钩子函数。
6.1 自省机制
debug.getinfo(func,t) 获取指定函数的执行信息,返回一个table,可以以数字指定调用层级。通过t可以指定获取哪些信息。
debug.traceback(func) 获得栈的回溯
debug.getlocal(func,var) 检查函数调用func中的指定局部变量的值
debug.setlocal(func,var,val)
debug.getupvalue(func,idx) 获取非局部变量的值
debug.setupvalue()
6.2 钩子
Lua支持为执行中的事件注册钩子函数。
有以下4类事件。
调用函数的call事件 c
函数执行完return事件 r
执行一行首先line事件 l
执行指令数count事件 count
debug.sethook(func,event) 可以为事件设置相应的处理函数
通过以上这些机制,可以对程序进行运行时性能统计、调试等。例如统计各函数的执行时间,函数的执行次数。函数执行的上下文信息。