lua5.1.4中实现自定义require的loader函数

本文介绍了在lua5.1.4中实现自定义require loader函数的过程,包括遇到的错误和解决方案。作者通过替换package.loaders[2]尝试实现,但遇到了环境设置的问题。通过查阅资料和云风的博客,了解到环境概念并尝试使用lua API和CAPI解决。最终成功实现自定义require,可以处理加密的lua文件,适合lua初学者参考。
摘要由CSDN通过智能技术生成

刚开始以为只是简单的把自己的C函数,替换到package.loaders[2](索引2是lua的文件加载器)里面就OK了,实际上也是这样的,但是这样的代价就是文件搜索啊,一堆一堆的判断啊都要自己做,因为这些lua本身已经实现了,所以肯定直接拿来用之。但问题来了,发现直接简单的package.loaders[2]=myloadfunc是失败的。会抛出这个错误:

luaL_error(L, LUA_QL("package.%s") " must be a string", pname);

好吧,我碰到个没碰到的问题:环境,之前这个东西概念的一直不清楚的,我也没想去马上去了解。于是Google,能搜到的唯一有用的东西就是云风博客上的那篇文章,里面说要先获取函数的环境,然后再设置给自己的函数。。。。。。。完全不懂,说的太简单,毕竟人家完全不考虑我们这些入门级选手。去找API,发现有个getfenv,然后为了方便直接用dostring来设置看看,结果失败。打印后发现,不管获取什么的环境都是一样的表。无奈之下去了解环境的概念,大概搞明白了,于是发现根据那个概念,似乎怎么都获取不到,毕竟你要在函数里面才能获取到环境,或者返回一个闭包才能获取到函数里面的环境。但是最好还是想到云风那个做法,于是想试试CAPI是否能获取到环境表。答案是肯定的,CAPI就能获取到package.loaders[2]的环境表。但是因为CAPI操作不熟练,搞了半天都没搞好,其实是搞错了设置table的方法,把自己的CFunction作为键放到loaders里面去了。找了半天,再去看看以前弄的操作,终于找到原因。改好后又出现重复加载文件的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值