是否可以在不重写当前内部数据的情况下重新安装当前加载的模块?
例如,如果我有一个名为names
的模块,其变量myname
等于' Stack'。假设我在模块中添加了一个新功能:
function whoami(self)
print("You are " .. self.myname)
end
在我已经加载的模块中,我已将myname
更改为'溢出'相反,如果我重新加载模块,它会将其重置回' Stack'。我怎么能更新模块,所以我存储的内容不会被覆盖?
答案 0 :(得分:1)
您可以删除package.loaded[ modulename ]
并再次致电require
来重新加载模块。但是,您要保留的所有内容都必须存储在模块外部,例如通过在重新加载模块并在之后加载数据之前将数据保存到文件中。大多数模块都不这样做,因此您只能重新加载专门为此设计的模块。
如果将模块数据存储在模块外部,则必须处理与其他代码的潜在冲突。幸运的是,Lua的模块系统已经这样做了,因此您可以将可变数据存储在单独的Lua模块中,并重新加载仅包含代码的模块:
档案names/data.lua
:
return {
myname = "Stack"
}
档案names.lua
(或names/init.lua
):
local data = require( "names.data" )
local names = {}
function names.dosomething()
print( data.myname )
end
return names
然后您可以重新加载names.lua
,names/data.lua
中存储的所有内容都保持不变。这仅适用于纯Lua模块,因为C库句柄也被缓存,因此package.loaded[ modulename ] = nil
不足以摆脱旧代码。
另请注意,可能存在仍然引用旧模块数据/函数的局部变量/ upvalues,因此模块重新加载不是一件非常可靠的事情。