C++ 如何创建可以重新创建的自定义需求

C++ 如何创建可以重新创建的自定义需求,c++,lua,C++,Lua,我在Lua中创建了自定义require函数,但是当我多次创建该函数时,它似乎并没有替换以前创建的require函数 我希望能够随时替换或覆盖以前的require函数 我的代码: 我预期的结果是: 我应该更改什么以获得预期的结果?您可以在全局命名空间中提供特殊的卸载功能:- 将第一个luaL_dostring中的Lua代码替换为以下内容: if uninstall_my_require then uninstall_my_require() end local require_origina

我在Lua中创建了自定义require函数,但是当我多次创建该函数时,它似乎并没有替换以前创建的require函数

我希望能够随时替换或覆盖以前的require函数

我的代码:

我预期的结果是:


我应该更改什么以获得预期的结果?

您可以在全局命名空间中提供特殊的卸载功能:- 将第一个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

您可以在全局命名空间中提供特殊的卸载功能:- 将第一个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函数设置为新函数,第二次保存新函数并将其设置为其他实例。在卢阿是这样的:

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's answer之类的卸载函数,或者将其更改为仅分配一次的全局函数:

require_original = require_original or require

第一次将全局require函数设置为新函数,第二次保存新函数并将其设置为其他实例。在卢阿是这样的:

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's answer之类的卸载函数,或者将其更改为仅分配一次的全局函数:

require_original = require_original or require

我认为您第一次将本地require_original设置为实际的lua require,并将全局require设置为您的函数。第二次,您将本地require_original设置为require函数,并用新的副本替换全局函数。因此,当您调用require时,它调用1您最新的require,调用2您的第一个require,调用3原始require。您可以使用全局require\u original只设置一次require\u original=require\u original或requireWhy不使用其他require函数创建新环境?@DarkWiiPlayer您可以告诉我如何执行吗?@ZackLee不可以,这取决于您其余代码的外观。在我想你第一次将本地require_original设置为实际的lua require,并将全局require设置为你的函数时,只需在中阅读它就会容易得多。第二次,您将本地require_original设置为require函数,并用新的副本替换全局函数。因此,当您调用require时,它调用1您最新的require,调用2您的第一个require,调用3原始require。您可以使用全局require\u original只设置一次require\u original=require\u original或requireWhy不使用其他require函数创建新环境?@DarkWiiPlayer您可以告诉我如何执行吗?@ZackLee不可以,这取决于您其余代码的外观。如果只是在报纸上读到它,会容易得多