是否可以重新安装当前加载的模块而不重写内部的当前数据?
例如,如果我有一个名为names的模块,其变量myname等于'Stack'。 假设我在模块中添加了一个新功能:
function whoami(self) print("You are " .. self.myname) end在我已加载的模块中,我将myname更改为'Overflow',如果我重新加载模块,它会将其重置为'Stack'。 我怎么能更新模块,所以我存储的内容不会被覆盖?
Is it possible to reinstall a currently loaded module without having it rewrite the current data inside?
For example, if I have a module called names, with a variable myname which is equal to 'Stack'. Say I added a new function to the module:
function whoami(self) print("You are " .. self.myname) endIn my already loaded module, I have changed myname to be 'Overflow' instead, and if I reloaded the module, it would reset it back to 'Stack'. How could I update the module so whatever I have stored is not overwritten?
最满意答案
您可以更改重新加载模块的方式,请参阅此函数以保存所有已编写的变量并在重新加载模块后重写其值:
function reload(m) if package.loaded[m] then local attrs = {} for key,value in pairs(package.loaded[m]) do attrs[key] = value end package.loaded[m] = nil temp_module = require(tostring(m)) for key,value in pairs(attrs) do temp_module[key] = value end else temp_module = require(m) end return temp_module end模块(names.lua):
local names = {} if not names["myname"] then names["myname"] = "Stack" end return names带索引的模块的第二个版本(也可以):
local names = {} names.mt = {} names.mt.__index = function (table, key) return "Stack" end setmetatable(names, names.mt) return names结果:
a = require "names" function whoami(self) print("You are " .. self.myname) end whoami(a) > You are Stack a.myname = "Overflow" whoami(a) > You are Overflow a = reload("names") > whoami(a) You are OverflowYou can change the way you reload the module, see this function that saves all written variables and rewrites their values after the module is reloaded:
function reload(m) if package.loaded[m] then local attrs = {} for key,value in pairs(package.loaded[m]) do attrs[key] = value end package.loaded[m] = nil temp_module = require(tostring(m)) for key,value in pairs(attrs) do temp_module[key] = value end else temp_module = require(m) end return temp_module endmodule(names.lua):
local names = {} if not names["myname"] then names["myname"] = "Stack" end return namesSecond version of the module with indexes(also works):
local names = {} names.mt = {} names.mt.__index = function (table, key) return "Stack" end setmetatable(names, names.mt) return namesResult:
a = require "names" function whoami(self) print("You are " .. self.myname) end whoami(a) > You are Stack a.myname = "Overflow" whoami(a) > You are Overflow a = reload("names") > whoami(a) You are Overflow更多推荐
发布评论