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