Lua-库

数学库

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值