如何创建可重新创建的自定义要求
How to create a custom require that can be recreated
我在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 = requiren"
"function require(name, ...)n"
"print('Hello World')n"
"local val = table.pack(require_original(name, ...))n"
"return table.unpack(val,1,val.n)n"
"endn");
luaL_dostring(L, "package.preload['A'] = function()n"
"local a = {}n"
"print('A required')n"
"return an"
"endn");
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
我应该改变什么才能得到我期望的结果?
您可以在全局命名空间中提供特殊的"卸载"功能:-(
将第一个
将第一个
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
第一次将全局
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 -- now the function above
function require(name, ...) -- redefine yet again
print('Hello World')
-- require_original2 is your function above
local val = table.pack(require_original2(name, ...))
return table.unpack(val,1,val.n)
end
您只需跟踪一次原始 require 函数,要么使用像 Egor 的答案这样的卸载函数,要么将其更改为仅分配一次的全局函数:
require_original = require_original or require
相关文章:
- 如何在创建自定义迭代器时获得 std::p air 的第一个和第二个?
- 如何为使用创建窗口创建的窗口创建自定义背景颜色
- 从函数为 std::vector 创建自定义扩展
- 是否有任何统一的方法可以在 c++ 中创建自定义比较器?
- 查询数据库以在 C++ 中创建自定义类集合的最佳方法
- 创建自定义向量类错误
- C ++ Google test (gtest):如何创建自定义断言和期望?
- 有没有办法使用 googletest 创建自定义参数生成器?
- 使用 WinAPI 创建自定义菜单的最佳方法是什么
- 在 rxcpp 中创建自定义运算符
- 调整大小的大小时,会创建自定义的Windows边框边缘消失
- 如何在Qt中创建自定义颜色选择器
- 我想在qt中创建自定义标题栏
- 如何为 QtCreator 创建自定义主题
- 如何在 cocos2d-x 中创建自定义操作
- 如何创建自定义计时时钟
- 在C 中创建自定义类的多个实例
- 在 V8 中创建自定义 JavaScript 函数
- 在C++中创建自定义异常
- 如何使用 1D 高斯内核在 Filter2D 上创建自定义 2D 内核