Lua是否优化重复的导入?

6
在简单模型中,我有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 等等...... 当我从 module-two.lua 中删除了对 base-module.lua 的导入时,我可以看到来自 base-module.lua 的所有函数和变量,但我的导入并不创新。像 Python 一样,Lua 是否会优化双重导入?

2个回答

6

是的,Lua可以做到。

第5.3节中,关于require的手册说明如下:

加载指定的模块。该函数首先查找package.loaded表,确定是否已经加载了modname。如果已经加载,则require返回存储在package.loaded[modname]中的值。


太好了!这个答案让我很开心 :) - itdxer

4

简短回答是:是的。

详细回答:

require (modname)

加载给定的模块。该函数首先查找 package.loaded 表,以确定是否已经加载了 modname。如果是,则 require 返回存储在 package.loaded[modname] 中的值。否则,它会尝试查找模块的加载器。

为了找到加载器,require 根据 package.loaders 数组进行指导。通过更改此数组,我们可以改变 require 查找模块的方式。以下解释基于 package.loaders 的默认配置。

首先,require 查询 package.preload[modname]。如果有一个值,则该值(应该是一个函数)是加载器。否则,require 使用存储在 package.path 中的路径搜索 Lua 加载器。如果那也失败了,它将使用存储在 package.cpath 中的路径搜索 C 加载器。如果那还失败了,它将尝试使用 all-in-one 加载器(参见 package.loaders)。

一旦找到加载器,require 就使用单个参数 modname 调用加载器。如果加载器返回任何值,则 require 将返回的值分配给 package.loaded[modname]。如果加载器没有返回任何值并且没有将任何值分配给 package.loaded[modname],则 require 将 true 分配给此条目。在任何情况下,require 都会返回 package.loaded[modname] 的最终值。

如果加载或运行模块时出现任何错误,或者无法找到模块的任何加载器,则 require 会发出错误信号。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接