Lua同步模块(Lua Synchronise Modules)

编程入门 行业动态 更新时间:2024-10-26 13:22:36
Lua同步模块(Lua Synchronise Modules)

是否可以重新安装当前加载的模块而不重写内部的当前数据?

例如,如果我有一个名为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) end

In 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 Overflow

You 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 end

module(names.lua):

local names = {} if not names["myname"] then names["myname"] = "Stack" end return names

Second 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 names

Result:

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

更多推荐

本文发布于:2023-07-26 10:32:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1274348.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:模块   Lua   Modules   Synchronise

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!