lua中require与package.loaded的关系以及脚本的重复加载

require(modname)

require函数的功能为加载一个模块,这个函数首先查找package.loaded表,检测modname是否被加载过,如果被加载过,require返回package.loaded[modname]中保存的值,否则,它试着为模块寻找加载器

用require函数只能加载一次文件,require函数的加载流程:
1.require函数会搜索目录加载文件
2.require会判断这个文件是否已经加载过了,而避免再次被加载

而如果我们要重复加载同一个文件时,反复调用require则不会达到想要的效果,因为除了第一次的加载,之后的每次加载都是返回package.loaded[modname]中所存储的值,不能满足实时的更新加载,这时我们可以这样一行代码package.loaded[modname]=nil ,之后再次调用require函数进行加载即可完成重复加载同一个脚本的需求了

test1:

package.loaded["test2"] = {name = "qqq"}
local b = package.loaded["test2"]

dofile("test2.lua")
local a = require("test2")
print("a.name=", a.name) --a.name= gcq
print("b.name=", b.name) --b.name= qqq

local c = package.loaded["test2"]
print("c.name=", c.name) --c.name= gcq

test2:

local M = {}
package.loaded["test2"] = M
print("name=", package.loaded["test2"].name) --name= nil
M.name = "gcq"
print("name=", package.loaded["test2"].name) --name= gcq
return M

lua中的表相当于一个指针test1中package.load[“test2"]就像当于一个指针,它存放的地址为{name=”qqq"}的地址,而b也相当于一个指针,存着的地址也为{name="qqq"},而在test2中将package.load[“test2"]指向了M,而此时M为{},则打印name的值则为nil,当给M.name赋值为"gcq"时,因为package.load[“test2"]存放的M的地址,所以再次打印的时候则打印出gcq,而在test1中,a通过require("test2")赋值,所以a与M指向同一块地址,所以打印为gcq,而b打印的还是qqq,c则与package.load[“test2"]指向同一块地址,所以打印name为gcq

local M = {}
local c = M

M.name = "wwww"

for i, v in pairs(c) do
    print(i, v) --name wwww
end

M = nil

for i, v in pairs(c) do
    print(i, v) --name wwww
end

lua中变量的赋值相当于C++中的智能指针,如下代码中,c与M指向同一块地址,它的值初始为{},当改变它的值时,打印c与M都会发生变化,当给M赋值为nil的时候,并不会影响到c的值,因为c还是指向原来的那块地址,所以打印时还是name wwww

local M = {}
local c = M

M.name = "wwww"

for i, v in pairs(c) do
    print(i, v) --name wwww
end

M = nil

for i, v in pairs(c) do
    print(i, v) --name wwww
end

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值