建设部网站政策法规,北师大网页制作与网站建设期末考试,广州注册公司必看,用wordpress制作表单从 Lua 的用户文档中我们知道 require(modName) 函数是用来加载模块的#xff0c;而如果这个modName已经用require 加载过的#xff0c;再调用require时#xff0c;将直接返回模块的值。因为函数首先查找 package.loaded 表#xff0c; 检测 modName 是否被加载… 从 Lua 的用户文档中我们知道 require(modName) 函数是用来加载模块的而如果这个modName已经用require 加载过的再调用require时将直接返回模块的值。因为函数首先查找 package.loaded 表 检测 modName 是否被加载过 如果被加载过了直接返回 package.loaded[modName] 的值。
目录
1模块的加载及返回值 2模块的搜索位置及顺序
3模块的清除 1模块的加载及返回值 我们可以打印一下 package.loaded 的类型看一看在默认情况下这里面加载了哪些模块如
#!/usr/local/bin/luaprint(package.loaded type is ..type(package.loaded));for key, value in pairs(package.loaded)
doprint(key, value);
endpackage.loaded 的类型是table默认下加载了以下的模块这些模块又都是一个table。 下面尝试加载一个自定义的模块即一个本地的 lua文件如
#!/usr/local/bin/luaprint(package.loaded type is ..type(package.loaded));local mytest require(testRequire)for key, value in pairs(package.loaded)
doprint(package.loaded[..key..] type is..type(value));
end 加载这个自定义的模块require 的返回值是一个函数类型所以如果用 local mytest require(testRequier) 时mytest 就是一个函数了则是可以用来调用的如
#!/usr/local/bin/luaprint(package.loaded type is ..type(package.loaded));local mytest require(testRequire)for key, value in pairs(package.loaded)
doprint(package.loaded[..key..] type is ..type(value));
endif type(mytest) function
thenmytest(this is a test);
end 那这个testRequire 模块在哪里同时它的内容是什么呢 print(load file testRequest.lua)function testRq(x)print(in file testRequire.lua, input param is: ..x)
endreturn testRq我们看到这个 testRequire.lua 最后返回了 testRq它是一个函数所以认为 package.loaded[testRequire] 是一个函数然后我们可以用返回值来当成函数调用。那如果tesetRequire 函数没有返回值或返回 nil 呢会是怎样的结果呢
print(load file testRequest.lua)function testRq(x)print(in file testRequire.lua, input param is: ..x)
endreturn nil --或没有这一行
返回值是一个布尔值
所以这样的话我们是没法使用 testRequire 模块里的函数的模块肯定需要返回一个非 nil 值否则 Lua 默认返回就是 true。
#!/usr/local/bin/luaprint(package.loaded type is ..type(package.loaded));local mytest require(testRequire)for key, value in pairs(package.loaded)
doprint(package.loaded[..key..] type is ..type(value));
endprint(mytest);if type(mytest) function
thenmytest(this is a test);
end 所以我们只要根据需求返回指定类型即可了下面尝试返回一个table把函数放到 table 里然后再把 table 返回来
print(load file testRequest.lua)function testRq(x)print(in file testRequire.lua, input param is: ..x)
endglobal {}global[testRq] testRq;return global; 然后我们可以这样使用
#!/usr/local/bin/luaprint(package.loaded type is ..type(package.loaded));local mytest require(testRequire)for key, value in pairs(package.loaded)
doprint(package.loaded[..key..] type is ..type(value));
endprint(mytest);if type(mytest) table
thenif type(mytest[testRq]) functionthenmytest[testRq](this is a test);end
end 照样能正常使用所以在使用 require 加载自定义模块时需要很清楚模块里的实现这样才能准确的使用这个加载的模块了。 2模块的搜索位置及顺序 模块的加载默认情况下肯定先搜索当前目录如果当前目录搜索不到时则会根据 package.searcher 表进行搜索这个表的默认值是什么呢我们看一下如果加载一个没有的模块名称require(testRequire1)看一看 3模块的清除 前面说过require函数加载时会先检查 package.loaded 表里是不是已经有 modName 的表项了如果有则直接返回表项的值那如果已经加载了想要清除该怎么操作呢
#!/usr/local/bin/luaprint(package.loaded type is ..type(package.loaded));local mytest require(testRequire)for key, value in pairs(package.loaded)
doprint(package.loaded[..key..] type is ..type(value));
endif type(mytest) table
thenif type(mytest[testRq]) functionthenmytest[testRq](this is a test);end
endpackage.loaded[testRequire] nil;
for key, value in pairs(package.loaded)
doprint(package.loaded[..key..] type is ..type(value));
end
因为 package.loaded 是全局变量我们是可以修改它的值的其结果为 在 package.loaded[testRequire] nil 后package.loaded 表里已经没有了 testRequire 表项了。