模块
模块系统的设计目标是可以使用不同的方式来共享代码,一个模块就是一个代码库,其它模块 可以使用 require 函数来加载,加载后得到模块导出的所有东西,如函数、常量、全局变量等。一个比较好的方式是让模块返回一个 table 并保存在一个全局变量中,然后外部模块直接使用这个全局变量来操作 table
模块定义–mod.lua
demo = {}
demo.var = 100
demo.foo = function()
print("hello lua")
end
return demo
使用模块–main.lua
local m = require("mod")
m.foo()
demo.foo()
print(m.var, demo.var)
require 函数
require 函数用于加载一个模块,其实现细节如下
function require(name)
if not package.loaded[name] then
local loader = findloader(name)
if loader == nil then
error("unable load module")
end
package.loaded[name] = true
local res = loader(name)
if res ~= nil then
package.loader[name] = res
end
end
return package.loaded[name]
end
- 当加载一个模块时,会先在表 package.loaded 中查找该模块是否已经加载,如果已经加载了直接返回上次加载后的结果,因此重复调用 require 来加载同一个模块是不会出问题的
- 如果模块未加载,则试着为模块查找一个加载器,这个过程是在表 package.preload 中查询模块名,如果在其中找到一个函数则把该函数作为模块的加载器,上面代码使用 findloader 来抽象这个过程
- 接下来就是使用加载器来加载模块了,加载之前先把 package.loaded[name] 的值设为 true 这样可以避免两个模块交叉引用时陷入死循环;加载完成后把模块返回的值保存下来,如果模块没有显式地返回某个值,则返回的结果为 true
- 最后返回 package.l