Lua中的常用函数库

每次都要去查找函数库,挺麻烦的于是干脆把一位朋友博客的内容搬运过来方便查找。附上原参考博客地址:http://www.cnblogs.com/whiteyun/category/203591.html

字符串函数库

string.len(s)          返回字符串s的长度;
string.rep(s, n)      返回重复n次字符串s的串;你使用string.rep(“a”, 2^20)可以创建一个1M bytes的字符串(比如,为了测试需要);
string.lower(s)       将s中的大写字母转换成小写(string.upper将小写转换成大写)。如果你想不关心大小写对一个数组进行排序的话,你可以这样:
table.sort(a, function (a, b) return string.lower(a) < string.lower(b) end)
string.upper(s)       将s中的小写字母转换成大写
string.upper和string.lower都依赖于本地环境变量。所以,如果你在 European Latin-1环境下,表达式:
string.upper(“a??o”)    –> “A??O”
string.sub(s,i,j)      函数截取字符串s的从第i个字符到第j个字符之间的串。Lua中,字符串的第一个字符索引从1开始。你也可以使用负索引,负索引从字符串的结尾向前计数:-1指向最后一个字符,-2指向倒数第二个,以此类推。所以, string.sub(s, 1, j)返回字符串s的长度为j的前缀;string.sub(s, j, -1)返回从第j个字符开始的后缀。如果不提供第3个参数,默认为-1,因此我们将最后一个调用写为string.sub(s, j);string.sub(s, 2, -2)返回去除第一个和最后一个字符后的子串。
s = “[in brackets]”
print(string.sub(s, 2, -2)) –> in brackets

Lua提供了string.format()函数来生成具有特定格式的字符串, 函数的第一个参数是格式(formatstring), 之后是对应格式中每个代号的各种数据. 由于格式字符串的存在, 使得产生的长字符串可读性大大提高了. 这个函数的格式很像C语言中的printf().函数string.format在用来对字符串进行格式化的时候,特别是字符串输出,是功能强大的工具。这个函数有两个参数,你完全可以照C语言的printf来使用这个函数。第一个参数为格式化串:由指示符和控制格式的字符组成。指示符后的控制格式的字符可以为:十进制’d’;十六进制’x’;八进制’o’;浮点数’f’;字符串’s’。在指示符’%’和控制格式字符之间还可以有其他的选项:用来控制更详细的格式,比如一个浮点数的小数的位数:

格式字符串可能包含以下的转义码:

%c – 接受一个数字, 并将其转化为ASCII码表中对应的字符
%d, %i – 接受一个数字并将其转化为有符号的整数格式
%o – 接受一个数字并将其转化为八进制数格式
%u – 接受一个数字并将其转化为无符号整数格式
%x – 接受一个数字并将其转化为十六进制数格式, 使用小写字母
%X – 接受一个数字并将其转化为十六进制数格式, 使用大写字母
%e – 接受一个数字并将其转化为科学记数法格式, 使用小写字母e
%E – 接受一个数字并将其转化为科学记数法格式, 使用大写字母E
%f – 接受一个数字并将其转化为浮点数格式
%g(%G) – 接受一个数字并将其转化为%e(%E, 对应%G)及%f中较短的一种格式
%q – 接受一个字符串并将其转化为可安全被Lua编译器读入的格式
%s – 接受一个字符串并按照给定的参数格式化该字符串

为进一步细化格式, 可以在%号后添加参数. 参数将以如下的顺序读入:

(1) 符号: 一个+号表示其后的数字转义符将让正数显示正号. 默认情况下只有负数显示符号.
(2) 占位符: 一个0, 在后面指定了字串宽度时占位用. 不填时的默认占位符是空格.
(3) 对齐标识: 在指定了字串宽度时, 默认为右对齐, 增加-号可以改为左对齐.
(4) 宽度数值
(5) 小数位数/字串裁切: 在宽度数值后增加的小数部分n, 若后接f(浮点数转义符, 如%6.3f)则设定该浮点数的小数只保留n位, 若后接s(字符串转义符, 如%5.3s)则设定该字符串只显示前n位.

一些例子:

string.format(“%%c: %c”, 83)            输出S
string.format(“%+d”, 17.0)              输出+17
string.format(“%05d”, 17)               输出00017
string.format(“%o”, 17)                 输出21
string.format(“%u”, 3.14)               输出3
string.format(“%x”, 13)                 输出d
string.format(“%X”, 13)                 输出D
string.format(“%e”, 1000)               输出1.000000e+03
string.format(“%E”, 1000)               输出1.000000E+03
string.format(“%6.3f”, 13)              输出13.000
string.format(“%q”, “One\nTwo”)         输出”One\
Two”
string.format(“%s”, “monkey”)           输出monkey
string.format(“%10s”, “monkey”)         输出    monkey
string.format(“%5.3s”, “monkey”)        输出  mon

 

数学库

math.pi 为圆周率常量 = 3.14159265358979323846
abs 取绝对值 math.abs(-15) 15
acos 反余弦函数 math.acos(0.5) 1.04719755
asin 反正弦函数 math.asin(0.5) 0.52359877
atan2 x / y的反正切值 math.atan2(90.0, 45.0) 1.10714871
atan 反正切函数 math.atan(0.5) 0.463647609
ceil 不小于x的最大整数 math.ceil(5.8) 6
cosh 双曲线余弦函数 math.cosh(0.5) 1.276259652
cos 余弦函数 math.cos(0.5) 0.87758256
deg 弧度转角度 math.deg(math.pi) 180
exp 计算以e为底x次方值 math.exp(2) 2.718281828
floor 不大于x的最大整数 math.floor(5.6) 5
fmod (mod) 取模运算 math.mod(14, 5) 4
frexp 把双精度数val分解为数字部分(尾数)和以2为底的指数n,即val=x*2n math.frexp(10.0) 0.625    4
ldexp 计算value * 2的n次方 math.ldexp(10.0, 3) 80 = 10 * (2 ^3)
log10 计算以10为基数的对数 math.log10(100) 2
log 计算一个数字的自然对数 math.log(2.71) 0.9969
max 取得参数中最大值 math.max(2.71, 100, -98, 23) 100
min 取得参数中最小值 math.min(2.71, 100, -98, 23) -98
modf 把数分为整数和小数 math.modf(15.98) 15    98
pow 得到x的y次方 math.pow(2, 5) 32
rad 角度转弧度 math.rad(180) 3.14159265358
random 获取随机数 math.random(1, 100)
math.random(100)
获取1-100的随机数
randomseed 设置随机数种子 math.randomseed(os.time()) 在使用math.random函数之前必须使用此函数设置随机数种子
sinh 双曲线正弦函数 math.sinh(0.5) 0.5210953
sin 正弦函数 math.sin(math.rad(30)) 0.5
sqrt 开平方函数 math.sqrt(16) 4
tanh 双曲线正切函数 math.tanh(0.5) 0.46211715
tan 正切函数 math.tan(0.5) 0.5463024

 

table函数库

table.concat(table, sep,  start, end)

concat是concatenate(连锁, 连接)的缩写. table.concat()函数列出参数中指定table的数组部分从start位置到end位置的所有元素, 元素间以指定的分隔符(sep)隔开。除了table外, 其他的参数都不是必须的, 分隔符的默认值是空字符, start的默认值是1, end的默认值是数组部分的总长.

sep, start, end这三个参数是顺序读入的, 所以虽然它们都不是必须参数, 但如果要指定靠后的参数, 必须同时指定前面的参数.

> tbl = {“alpha”, “beta”, “gamma”}
> print(table.concat(tbl, “:”))
alpha:beta:gamma
> print(table.concat(tbl, nil, 1, 2))
alphabeta
> print(table.concat(tbl, “\n”, 2, 3))
beta
gamma

table.insert(table, pos, value)

table.insert()函数在table的数组部分指定位置(pos)插入值为value的一个元素. pos参数可选, 默认为数组部分末尾.

> tbl = {“alpha”, “beta”, “gamma”}
> table.insert(tbl, “delta”)
> table.insert(tbl, “epsilon”)
> print(table.concat(tbl, “, “)
alpha, beta, gamma, delta, epsilon
> table.insert(tbl, 3, “zeta”)
> print(table.concat(tbl, “, “)
alpha, beta, zeta, gamma, delta, epsilon


table.maxn(table)

table.maxn()函数返回指定table中所有正数key值中最大的key值. 如果不存在key值为正数的元素, 则返回0. 此函数不限于table的数组部分.

> tbl = {[1] = “a”, [2] = “b”, [3] = “c”, [26] = “z”}
> print(#tbl)
3               — 因为26和之前的数字不连续, 所以不算在数组部分内
> print(table.maxn(tbl))
26
> tbl[91.32] = true
> print(table.maxn(tbl))
91.32
table.remove(table, pos)

table.remove()函数删除并返回table数组部分位于pos位置的元素. 其后的元素会被前移. pos参数可选, 默认为table长度, 即从最后一个元素删起.
table.sort(table, comp)

table.sort()函数对给定的table进行升序排序.

> tbl = {“alpha”, “beta”, “gamma”, “delta”}
> table.sort(tbl)
> print(table.concat(tbl, “, “))
alpha, beta, delta, gamma

comp是一个可选的参数, 此参数是一个外部函数, 可以用来自定义sort函数的排序标准.

此函数应满足以下条件: 接受两个参数(依次为a, b), 并返回一个布尔型的值, 当a应该排在b前面时, 返回true, 反之返回false.

例如, 当我们需要降序排序时, 可以这样写:

> sortFunc = function(a, b) return b < a end
> table.sort(tbl, sortFunc)
> print(table.concat(tbl, “, “))
gamma, delta, beta, alpha
table.foreachi(table, function(i, v))
会期望一个从 1(数字 1)开始的连续整数范围,遍历table中的key和value逐对进行function(i, v)操作

t1 = {2, 4, 6, language=”Lua”, version=”5″, 8, 10, 12, web=”hello lua”};
table.foreachi(t1, function(i, v) print (i, v) end) ; –等价于foreachi(t1, print)

输出结果:
1 2
2 4
3 6
4 8
5 10
6 12

table.foreach(table, function(i, v))
与foreachi不同的是,foreach会对整个表进行迭代

t1 = {2, 4, 6, language=”Lua”, version=”5″, 8, 10, 12, web=”hello lua”};
table.foreach(t1, function(i, v) print (i, v) end) ;

输出结果:
1 2
2 4
3 6
4 8
5 10
6 12
web hello lua
language Lua
version 5

table.getn(table)
返回table中元素的个数

t1 = {1, 2, 3, 5};
print(getn(t1))
->4

table.setn(table, nSize)
设置table中的元素个数

 

操作系统库

 

os.clock ()
功能:返回一个程序使用CPU时间的一个近似值

例如:
local x = os.clock();
print(os.clock())
local s = 0;
for i = 1, 100000000 do
s = s + i;
end
print(string.format(“elapsed time : %.2f\n”, os.clock() – x));

输出:
0
elapsed time : 2.55
——————————————————————————–

os.date ([format [, time]])
功能:返回一个按format格式化日期、时间的字串或表
若设置time参数,则按time指定的时间格式化,否则按当前时间格式化
参数:
format:
“!”:按格林尼治时间进行格式化。
“*t”:将返一个带year(4位),month(1-12), day (1–31), hour (0-23), min (0-59), sec (0-61), wday (星期几, 星期天为1), yday (年内天数), and isdst (是否为日光节约时间true/false)的带键名的表; 若没有”*t”则返回一个按C的strftime函数格式化的字符串
若不带参数,则按当前系统的设置返回格式化的字符串 os.date() <=> os.date(“%c”)

例如:
t = os.date(“*t”, os.time());
for i, v in pairs(t) do
print(i, v);
end

输出:
hour  14
min   58
wday  2
day   10
month  8
year  2009
sec   18
yday  222
isdst  false

对于其它的格式字符串,os.date会将日期格式化为一个字符串

例如:
print(os.date(“today is %A, in %B”))      –>today is Tuesday, in May
print(os.date(“%x”, 906000490))           –>09/16/1998

所有格式化字符串如下:

%a      一星期中天数的简写                      (Wed)
%A      一星期中天数的全称                      (Wednesday)
%b      月份的简写                                  (Sep)
%B      月份的全称                                  (September)
%c      日期和时间                                   (09/16/98 23:48:10)
%d      一个月中的第几天                          (16)[0 ~ 31]
%H      24小时制中的小时数                      (23)[00 ~ 23]
%I      12小时制中的小时数                       (11)[01 ~ 12]
%j      一年中的第几天                             (259)[01 ~ 366]
%M      分钟数                                       (48)[00 ~ 59]
%m      月份数                                       (09)[01 ~ 12]
%P      “上午(am)” 或 “下午(pm)”               (pm)
%S      秒数                                          (10)[00 ~ 59]
%w      一星期中的第几天                         (3)[0 ~ 6 = 星期天 ~ 星期六]

%W  一年中的第几个星期        0 ~ 52
%x      日期                                          (09/16/98)
%X      时间                                          (23:48:10)
%y      两位数的年份                               (90)[00 ~ 99]
%Y      完整的年份                                 (2009)
%%      字符串’%’
——————————————————————————–

os.difftime (t2, t1)
功能:返回t1到t2相差的秒数

例如:
t1 = os.time();
for i = 0, 10000000 do
os.time();
end
t2 = os.time();
print(os.difftime(t2, t1));

输出:
2
——————————————————————————–

os.execute ([command])
功能:相当于C的system函数,返回系统状态码

例如:
os.execute(“pause”)

输出:
按任意键继续. . .
——————————————————————————–

os.exit (

)
功能:相当于C的exit函数,终止主程序,code为返回值

例如:
os.exit(1)
——————————————————————————–

os.getenv (varname)-
功能:返回当前进程的环境变量varname的值,若变量没有定义时返回nil

例如:
print(os.getenv(“USERDOMAIN”))
print(os.getenv(“SystemRoot”))
print(os.getenv(“Os2LibPath”))
print(os.getenv(“ProgramFiles” ))
print(os.getenv(“APPDATA” ))
print(os.getenv(“ALLUSERSPROFILE” ))
print(os.getenv(“CommonProgramFiles” ))
print(os.getenv(“COMPUTERNAME” ))
print(os.getenv(“USERNAME”))
print(os.getenv(“USERPROFILE” ))
print(os.getenv(“ComSpec”))
print(os.getenv(“LOGONSERVER” ))
print(os.getenv(“NUMBER_OF_PROCESSORS” ))
print(os.getenv(“OS”))
print(os.getenv(“PATHEXT” ))
print(os.getenv(“PROCESSOR_ARCHITECTURE” ))
print(os.getenv(“PROCESSOR_IDENTIFIER” ))
print(os.getenv(“PROCESSOR_LEVEL” ))
print(os.getenv(“PROCESSOR_REVISION” ))
print(os.getenv(“USERDOMAIN”))
print(os.getenv(“SystemRoot” ))
print(os.getenv(“TEMP”))

输出:
RDEV
C:\WINDOWS
nil
C:\Program Files
C:\Documents and Settings\baiyun\Application Data
C:\Documents and Settings\All Users
C:\Program Files\Common Files
BAIYUN
baiyun
C:\Documents and Settings\baiyun
C:\WINDOWS\system32\cmd.exe
http://www.cnblogs.com/whiteyun/admin/file://rdev1/
2
Windows_NT
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.py;.pyw;.wlua
x86
x86 Family 15 Model 6 Stepping 5, GenuineIntel
15
0605
RDEV
C:\WINDOWS
C:\DOCUME~1\baiyun\LOCALS~1\Temp
——————————————————————————–

os.remove (filename)
功能:删除文件或一个空目录,若函数调用失败则返加nil加错误信息
——————————————————————————–

os.rename (oldname, newname)
功能:更改一个文件或目录名,若函数调用失败则返加nil加错误信息
——————————————————————————–

os.setlocale (locale [, category])
功能:设置程序的当前设置,函数返回最新的值,失败则返回nil
参数:
locale:一个指定当前设置的字串
“”:一个空字串,当前设置被视为本地设置
“c”:当前设置被视为标准c设置
nil:返回category指示设置名的当前值
category:一个描述要更改的设置名
“all”[默认], “collate”, “ctype”, “monetary”, “numeric”, “time”
——————————————————————————–

os.time ([table])
功能:按table的内容返回一个时间值(数字),若不带参数则返回当前时间
table的字段:
year, month, day, hour, min, sec, isdst

例如:
print(os.time());
–>1249887340
print(os.time({year=1970, month=1, day=1, hour=0}));
–>10500
——————————————————————————–

os.tmpname()
功能:返回一个临时文件名

 

基本函数库

assert (v [, message])
功能:相当于C的断言,
参数:
v:当表达式v为nil或false将触发错误,
message:发生错误时返回的信息,默认为”assertion failed!”
——————————————————————————–

collectgarbage (opt [, arg])
功能:是垃圾收集器的通用接口,用于操作垃圾收集器
参数:
opt:操作方法标志
“Stop”: 停止垃圾收集器
“Restart”: 重启垃圾收集器
“Collect”: 执行一次全垃圾收集循环
“Count”: 返回当前Lua中使用的内存量(以KB为单位)
“Step”: 单步执行一个垃圾收集. 步长 “Size” 由参数arg指定 (大型的值需要多步才能完成),如果要准确指定步长,需要多次实验以达最优效果。如果步长完成一次收集循环,将返回True
“Setpause”: 设置 arg/100 的值作为暂定收集的时长
“Setstepmul”: 设置 arg/100 的值,作为步长的增幅(即新步长=旧步长*arg/100)
——————————————————————————–

dofile (filename)
功能:打开并且执行一个lua块,当忽略参数filename时,将执行标准输入设备(stdin)的内容。返回所有块的返回值。当发生错误时,dofile将错误反射给调用者
注:dofile不能在保护模式下运行
——————————————————————————–

error (message [, level])
功能:终止正在执行的函数,并返回message的内容作为错误信息(error函数永远都不会返回)
通常情况下,error会附加一些错误位置的信息到message头部.
Level参数指示获得错误的位置,
Level=1[默认]:为调用error位置(文件+行号)
Level=2:指出哪个调用error的函数的函数
Level=0:不添加错误位置信息
——————————————————————————–

_G全局环境表(全局变量)
功能:记录全局环境的变量值的表 _G._G = _G
——————————————————————————–

getfenv(f)
功能:返回函数f的当前环境表
参数:f可以为函数或调用栈的级别,级别1[默认]为当前的函数,级别0或其它值将返回全局环境_G
——————————————————————————–

getmetatable(object)
功能:返回指定对象的元表(若object的元表.__metatable项有值,则返回object的元表.__metatable的值),当object没有元表时将返回nil
——————————————————————————–

ipairs (t)
功能:返回三个值 迭代函数、表、0
多用于穷举表的键名和键值对
如:for i,v in ipairs(t) do

end
每次循环将索引赋级i,键值赋给v
注:本函数只能用于以数字索引访问的表 如:t={“1″,”cash”}
——————————————————————————–

load (func [, chunkname])
功能:装载一个块中的函数,每次调用func将返回一个连接前一结的字串,在块结尾处将返回nil
当没有发生错误时,将返回一个编译完成的块作为函数,否则返回nil加上错误信息,此函数的环境为全局环境
chunkname用于错误和调试信息
——————————————————————————–

loadfile ([filename])
功能:与load类似,但装载的是文件或当没有指定filename时装载标准输入(stdin)的内容
——————————————————————————–

loadstring (string [, chunkname])
功能:与load类似,但装载的内容是一个字串
如:assert(loadstring(s))()
——————————————————————————–

next (table [, index])
功能:允许程序遍历表中的每一个字段,返回下一索引和该索引的值。
参数:table:要遍历的表
index:要返回的索引的前一索中的号,当index为nil[]时,将返回第一个索引的值,当索引号为最后一个索引或表为空时将返回nil
注:可以用next(t)来检测表是否为空(此函数只能用于以数字索引的表与ipairs相类似)
——————————————————————————–

ipairs (t)
功能:返回三个值 next函数、表、0
多用于穷举表的键名和键值对
如:for n,v in pairs(t) do

end
每次循环将索引赋级i,键值赋给v
注:本函数只能用于以键名索引访问的表 如:t={id=”1″,name=”cash”}
——————————————————————————–

pcall (f, arg1, ···)
功能:在保护模式下调用函数(即发生的错误将不会反射给调用者)
当调用函数成功能返回true,失败时将返回false加错误信息
——————————————————————————–

print (···)
功能:简单的以tostring方式格式化输出参数的内容
——————————————————————————–

rawequal (v1, v2)
功能:检测v1是否等于v2,此函数不会调用任何元表的方法
——————————————————————————–

rawget (table, index)
功能:获取表中指定索引的值,此函数不会调用任何元表的方法,成功返回相应的值,当索引不存在时返回nil
注:本函数只能用于以数字索引访问的表 如:t={“1″,”cash”}
——————————————————————————–

rawset (table, index, value)
功能:设置表中指定索引的值,此函数不会调用任何元表的方法,此函数将返回table
——————————————————————————–

select (index, ···)
功能:当index为数字将返回所有index大于index的参数:如:select(2,”a”,”b”) 返回 “b”
当index为”#”,则返回参数的总个数(不包括index)
——————————————————————————–

setfenv (f, table)
功能:设置函数f的环境表为table
参数:f可以为函数或调用栈的级别,级别1[默认]为当前的函数,级别0将设置当前线程的环境表
——————————————————————————–

setmetatable (table, metatable)
功能:为指定的table设置元表metatable,如果metatable为nil则取消table的元表,当metatable有__metatable字段时,将触发错误
注:只能为LUA_TTABLE 表类型指定元表
——————————————————————————–

tonumber (e [, base])
功能:尝试将参数e转换为数字,当不能转换时返回nil
base(2~36)指出参数e当前使用的进制,默认为10进制,如tonumber(11,2)=3
——————————————————————————–

tostirng(e)
功能:将参数e转换为字符串,此函数将会触发元表的__tostring事件
——————————————————————————–

type(v)
功能:返回参数的类型名(“nil”,”number”, “string”, “boolean”, “table”, “function”, “thread”, “userdata”)
——————————————————————————–

unpack (list [, i [, j]])
功能:返回指定表的索引的值,i为起始索引,j为结束索引
注:本函数只能用于以数字索引访问的表,否则只会返回nil 如:t={“1″,”cash”}
——————————————————————————–

_VERSION
功能:返回当前Lua的版本号”Lua 5.1″.
——————————————————————————–

xpcall (f, err)
功能:与pcall类似,在保护模式下调用函数(即发生的错误将不会反射给调用者)
但可指定一个新的错误处理函数句柄
当调用函数成功能返回true,失败时将返回false加err返回的结果

发表评论

电子邮件地址不会被公开。