在简单模型中,我有3个文件:
base-module.lua
module-one.lua
module-two.lua
这是我的导入连接:
module-two.lua < --|
^ |
| |
| |
module-one.lua |
^ |
| |
| |
base-module.lua ----
module-one.lua
导入base-module.lua
等等......
当我从base-module.lua
删除module-two.lua
导入时,我会看到base-module.lua
中的所有函数和变量,但我的导入并不具有创造性。例如,lua是否优化了双重导入,例如pytho?
答案 0 :(得分:6)
是的,Lua确实。
正如section 5.3中require
上的手册所说:
加载给定的模块。该功能从查看开始 package.loaded表来确定modname是否已经加载。 如果是,则require返回存储的值 package.loaded [的modname]。
答案 1 :(得分:4)
简短的回答,是的。
require(modname)
加载给定的模块。该功能从查看开始 package.loaded表来确定modname是否已经加载。 如果是,则require返回存储的值 package.loaded [的modname]。否则,它会尝试找到一个加载器 模块。
要查找加载程序,require由package.loaders数组指导。通过 更改此数组,我们可以更改查找模块的方式。该 以下说明基于默认配置 package.loaders。
首先要求查询package.preload [modname]。如果它有一个值, 这个值(应该是一个函数)是加载器。除此以外 要求使用存储的路径搜索Lua加载程序 package.path。如果这也失败了,它会使用。搜索C loader 存储在package.cpath中的路径。如果这也失败了,它会尝试一个 一体化加载器(参见package.loaders)。
找到加载程序后,需要使用单个程序调用加载程序 参数,modname。如果加载器返回任何值,则需要分配 返回值为package.loaded [modname]。如果加载器返回 没有值,也没有为package.loaded [modname]赋值, 然后要求为此条目指定true。无论如何,要求退货 package.loaded [modname]的最终值。
如果加载或运行模块有任何错误,或者不能 找到模块的任何加载器,然后要求信号出错。