数学库
math库由一组标准的数学函数构成,包括三角函数(sin,cos,tan,asin,acos 等)。变量 pi 和 huge ,其中 huge 表示Lua可以表示的最大数
函数 randonseed() 用于设置伪随机数生成器的种子数,如果种子数相同的话,程序运行每次都会生成相同的随机数。如希望得到不同的随机数,则使用当前时间作为种子数。
调试库
自省函数 debug.getinfo()
第一个参数可以是一个函数或一个栈层。当未某函数 foo 调用 debug.getinfo 时,就会得到一个 table,其中包含了一些与该函数相关的函数的信息。
-
source
如果函数是通过 loadstring 加载的,source 就是这个字符串,如果是在一个文件中定义的,则是文件名加前缀 “** @**” -
short_src
source的短版本,可用于错误信息中 -
linedefined
该函数定义在源代码的第一行的行号 -
lastlinedefined
该函数定义的源代码最后一行的行号 -
what
函数的类型,“Lua” - lua函数,“C” - C函数,“main” - Lua程序块的主程序部分 -
name
名称 -
namewhat
上一个字段的含义,可能是“global”,“local”,“method”,“field”或者 “” (空字符串),空字符串表示Lua没有找该函数名称 -
nups
该函数的 upvalue 的数量 -
activalines
一个table,包含了所有活动行的集合,“活动行”是指含有代码的行,这是相对于空行或只包含注释的行而言 -
func
函数本身
当foo是一个C函数时,Lua没有关于它更多的信息,只有 what,name 和 namewhat 是有意义的
debug.getinfo
当用一个数字 n 调用 debug.getinfo(n)时,就可以得到相应栈层上函数的数据。
如 n = 1 ,可以得到调用 debug.getinfo 的那个函数的数据,如果 n > 栈中函数的总和,就返回 nil
当用一个数字调用 debug.getinfo 时,返回的 table 中还有一个额外的字段 currentline ,表示当前函数正在执行的那行,并且,func就是处于该层上的那个函数
getinfo 还有第二个可选的参数,用于指定希望获取哪些信息。
通过这个参数,函数就不会浪费时间去收集其它不需要的数据,这个参数是一个字符串,每一个字母代表一组字段, 如 “ nfs ” 就可以取到三个类型的数据
调试库提供了一个改进版本, traceback ,不同的是,traceback 不会打印结果,而是返回一个表示追溯结果的字符串(通常很长)
debug.getlocal
次函数可以检查任意活动函数的局部变量,两个参数,一个参数是查询的函数栈层,另一个变量的索引,返回的是两个值变量的名字和它的当前值;如果变量索引大于活动变量的总书,getlocal会返回nil,如果栈层是无效的,getlocal会引发一个错误,可以使用 debug.getinfo来检查栈层是否有效
需要注意的是此方法只可以获取活动中的变量,如一个变量只是声明了但是没有使用的话,将会返回nil
钩子函数
sethook ,这个函数会在程序运行中某个特定的事件发生时调用
- call Lua调用一个函数时产生
- return 函数返回时
- line Lua开始执行一行新代码时产生
- count 执行完指定数量的指令后产生
对于 line 事件,Lua需要传入第二个参数,表示代码的行号,钩子函数内部可以调用 debug.getinfo 获取更多信息。
注册钩子函数,需要两到三个参数,debug.sethook , 第一个是设置的 钩子函数 ,第二个参数是一个字符串,描述需要监控的事件,第三个参数是一个可选的数字,用于说明多久获得一次count 事件
call,return,line :使用首字母调用 “c”,“r”,“l”
line : 在第三个参数中指定一个计数器
关闭钩子函数,需要不带参数调用 sethook