如何创建一个可重复生成的自定义require函数
2018-8-8 9:40:18
收藏:0
阅读:93
评论:2
我在Lua中创建了我的自定义require函数,但当我多次创建该函数时,它似乎无法替换先前创建的require函数。
我希望能够随时替换(或覆盖)以前的require函数。
我的代码:
#include "lua.hpp"
int main()
{
lua_State *L = luaL_newstate();
luaL_openlibs(L);
luaopen_my(L);
lua_settop(L, 0);
for (int i = 0; i < 2; ++i)
{
luaL_dostring(L, "local require_original = require\n"
"function require(name, ...)\n"
"print('Hello World')\n"
"local val = table.pack(require_original(name, ...))\n"
"return table.unpack(val,1,val.n)\n"
"end\n");
luaL_dostring(L, "package.preload['A'] = function()\n"
"local a = {}\n"
"print('A required')\n"
"return a\n"
"end\n");
luaL_dostring(L, "local a = require 'A'");
luaL_dostring(L, "package.preload['A'] = nil package.loaded['A'] = nil");
}
lua_close(L);
}
我得到的结果 :
Hello World
A required
Hello World
Hello World
A required
我期望的结果 :
Hello World
A required
Hello World
A required
我应该更改什么以获得我期望的结果?
点赞
用户369792
第一次执行时,你正在将全局 require 函数设置为你的新函数,第二次执行时,你正在保存 你的新函数 并将它设置为另一个实例。在 Lua 中,就像这样:
local require_original1 = require
function require(name, ...)
print('Hello World')
local val = table.pack(require_original1(name, ...))
return table.unpack(val,1,val.n)
end
local require_original2 = require -- 现在上面的函数
function require(name, ...) -- 再次重新定义
print('Hello World')
-- require_original2 是你上面的函数
local val = table.pack(require_original2(name, ...))
return table.unpack(val,1,val.n)
end
你需要跟踪原始 require 函数只需一次,可以使用像 Egor 的答案那样的卸载函数,也可以将它更改为仅分配一次的全局变量:
require_original = require_original or require
2018-08-08 18:37:48
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

你可以在全局命名空间中提供特殊的“卸载”函数:-)
将第一个
luaL_dostring中的 Lua 代码替换为以下代码:if uninstall_my_require then uninstall_my_require() end local require_original = require local function my_require(name, ...) print('Hello World') local val = table.pack(require_original(name, ...)) return table.unpack(val,1,val.n) end require = my_require function uninstall_my_require() if require == my_require then require = require_original end uninstall_my_require = nil end