常用库介绍
[TOC]
@date: 2019-3-25 23:03:27
String 库
..
链接两个字符串string.upper(argument)
字符串全部转为大写字母。string.lower(argument)
字符串全部转为小写字母。string.len(arg)
计算字符串长度string.reverse(arg)
字符串反转string.format(...)
返回一个类似printf的格式化字符串string.byte(s [, i [, j ]])
转换字符为整数值(可以指定某个字符,默认第一个字符)string.char(arg)
将整型数字转成字符并连接string.rep(string, n)
返回字符串string的n个拷贝string.gsub(mainString, findString, replaceString, num)
在字符串中替换,mainString为要替换的字符串, findString 为被替换的字符,replaceString 要替换的字符,num 替换次数(可以忽略,则全部替换)string.find (str, substr, [init, [end]])
在一个指定的目标字符串中搜索指定的内容(第三个参数为索引),返回其具体位置。不存在则返回 nil。string.gmatch(str, pattern)
返回一个迭代器函数,每一次调用这个函数,返回一个在字符串 str 找到的下一个符合 pattern 描述的子串。如果参数 pattern 描述的字符串没有找到,迭代函数返回nil。string.match(str, pattern, init)
寻找源字串str中的第一个配对. 参数init可选, 指定搜寻过程的起点, 默认为1。 在成功配对时, 函数将返回配对表达式中的所有捕获结果; 如果没有设置捕获标记, 则返回整个配对字符串. 当没有成功的配对时, 返回nil。
字符串格式化
string.format()
类似c里的printf()
。示例:
print(string.format("name %s, age %s", "yjc", 20)) -- name yjc, age 20
print(string.format("%.4f",1/3)) -- 0.3333
格式字符串可能包含以下的转义码:
%c
- 接受一个数字, 并将其转化为ASCII码表中对应的字符%d
,%i
- 接受一个数字并将其转化为有符号的整数格式%o
- 接受一个数字并将其转化为八进制数格式%u
- 接受一个数字并将其转化为无符号整数格式%x
- 接受一个数字并将其转化为十六进制数格式, 使用小写字母%X
- 接受一个数字并将其转化为十六进制数格式, 使用大写字母%e
- 接受一个数字并将其转化为科学记数法格式, 使用小写字母e%E
- 接受一个数字并将其转化为科学记数法格式, 使用大写字母E%f
- 接受一个数字并将其转化为浮点数格式%g(%G)
- 接受一个数字并将其转化为%e(%E, 对应%G)及%f中较短的一种格式%q
- 接受一个字符串并将其转化为可安全被Lua编译器读入的格式%s
- 接受一个字符串并按照给定的参数格式化该字符串
为进一步细化格式, 可以在%
号后添加参数. 参数将以如下的顺序读入:
- 符号: 一个+号表示其后的数字转义符将让正数显示正号. 默认情况下只有负数显示符号.
- 占位符: 一个0, 在后面指定了字串宽度时占位用. 不填时的默认占位符是空格.
- 对齐标识: 在指定了字串宽度时, 默认为右对齐, 增加-号可以改为左对齐.
- 宽度数值
- 小数位数/字串裁切: 在宽度数值后增加的小数部分n, 若后接f(浮点数转义符, 如
%6.3f
)则设定该浮点数的小数只保留n位, 若后接s(字符串转义符, 如%5.3s
)则设定该字符串只显示前n位.
注:
string.match()
、string.gmatch()
目前并不能被 JIT 编译,OpenResty 里应尽量使用ngx_lua
模块提供的ngx.re.match
等API。
Table 库
table.concat (table [, sep [, start [, end]]])
concat是concatenate(连锁, 连接)的缩写. table.concat()函数列出参数中指定table的数组部分从start位置到end位置的所有元素, 元素间以指定的分隔符(sep)隔开。table.insert (table, [pos,] value)
在table的数组部分指定位置(pos)插入值为value的一个元素. pos参数可选, 默认为数组部分末尾.table.maxn (table)
指定table中所有正数key值中最大的key值. 如果不存在key值为正数的元素, 则返回0。(Lua5.2之后该方法已经不存在了,本文使用了自定义函数实现)table.remove (table [, pos])
返回table数组部分位于pos位置的元素. 其后的元素会被前移. pos参数可选, 默认为table长度, 即从最后一个元素删起。table.sort (table [, comp])
对给定的table进行升序排序。
日期时间库
os.time ([table])
如果不使用参数 table 调用 time 函数,它会返回当前的时间和日期(它表示从某一时刻到现在的秒数)。如果用 table 参数,它会返回一个数字,表示该 table 中 所描述的日期和时间(它表示从某一时刻到 table 中描述日期和时间的秒数)。os.difftime (t2, t1)
返回 t1 到 t2 的时间差,单位为秒。os.date ([format [, time]])
把一个表示日期和时间的数值,转换成更高级的表现形式。其第一个参数 format 是一个格式化字符串,描述了要返回的时间形式。第二个参数 time 就是日期和时间的数字表示,缺省时默认为当前的时间。
如果使用OpenResty,不建议使用Lua的标准时间函数,因为这些函数通常会引发不止一个昂贵的系统调用,同时无法为 LuaJIT JIT 编译,对性能造成较大影响。推荐使用 ngx_lua 模块提供的带缓存的时间接口,如
ngx.today
,ngx.time
,ngx.utctime
,ngx.localtime
,ngx.now
,ngx.http_time
,以及ngx.cookie_time
等。
数学库
常用数学函数:
math.rad(x)
角度x转换成弧度math.deg(x)
弧度x转换成角度math.max(x, ...)
返回参数中值最大的那个数,参数必须是number型math.min(x, ...)
返回参数中值最小的那个数,参数必须是number型math.random ([m [, n]])
不传入参数时,返回 一个在区间[0,1)内均匀分布的伪随机实数;只使用一个整数参数m时,返回一个在区间[1, m]内均匀分布的伪随机整数;使用两个整数参数时,返回一个在区间[m, n]内均匀分布的伪随机整数math.randomseed (x)
为伪随机数生成器设置一个种子x,相同的种子将会生成相同的数字序列math.abs(x)
返回x的绝对值math.fmod(x, y)
返回 x对y取余数math.pow(x, y)
返回x的y次方math.sqrt(x)
返回x的算术平方根math.exp(x)
返回自然数e的x次方math.log(x)
返回x的自然对数math.log10(x)
返回以10为底,x的对数math.floor(x)
返回最大且不大于x的整数math.ceil(x)
返回最小且不小于x的整数math.pi
圆周率math.sin(x)
求弧度x的正弦值math.cos(x)
求弧度x的余弦值math.tan(x)
求弧度x的正切值math.asin(x)
求x的反正弦值math.acos(x)
求x的反余弦值math.atan(x)
求x的反正切值
示例:
-- src/test_math.lua
print(math.pi) -- 3.1415926535898
print(math.pow(2,3)) -- 8
print(math.max(-1, 2, 0, 3.6, 9.1)) -- 9.1
print(math.floor(3.14159)) -- 3
print(math.ceil(7.9988)) -- 8
注意:使用 math.random()
函数获得伪随机数时,如果不使用 math.randomseed()
设置伪随机数生成种子或者设置相同的伪随机数生成种子,那么得得到的伪随机数序列是一样的。示例:
-- math.randomseed(os.time()) -- 设置随机种子
print(math.random()) -- 0.79420629243124
print(math.random(10)) -- 7
print(math.random(10,20)) -- 16
上面的例子里同一机器运行多次的结果是一样的,只有设置了随机的伪随机数生成种子,才能保证每次生成的随机数是不相同的。
参考
1、OpenResty最佳实践
https://moonbingbing.gitbooks.io/openresty-best-practices/
2、Lua 5.3 参考手册 - 目录
http://www.runoob.com/manual/lua53doc/contents.html
3、Lua 字符串 | 菜鸟教程
http://www.runoob.com/lua/lua-strings.html