
























在 Lua 中,当多个脚本文件循环 require 时(例如 A 依赖 B,B 又依赖 A),最后 require 的值为 true 是由于 Lua 的 模块加载机制 和 避免无限循环 的设计导致的:
package.loaded 表跟踪已加载的模块。package.loaded 中设置 A = true(临时占位符)。require B,而 B 又尝试 require A:package.loaded[A] 已存在(值为 true)。true,避免无限循环。true)。在lua5.1中,出现循环require会直接报错(这边我们不讨论在5.1下的情况),如果报错是非常容易排查的,如下图:

假设有两个文件互相依赖:
1 | Start loading A |
main.lua 执行 require "a",开始加载 A。require "b",开始加载 B。require "a",此时 A 正在加载中(package.loaded[a] = true),直接返回 true。a 获取到占位符 true。package.loaded["a"] 被替换为 "Module A"。a 值不会更新(仍是 true)。关键函数在 loadlib.c 中的 ll_require 函数:
1 | static int ll_require (lua_State *L) { |
package.loaded**:若模块已存在,直接返回其值。package.loaded[name] = true,标记模块正在加载。require 当前模块时,直接返回占位符 true。true)。require(例如在函数内部调用)。1 |
|
require。最佳实践:模块设计应遵循 单向依赖 原则,避免循环
require。若无法避免,需明确处理占位值true的情况。
本文标题:在Lua中循环Require是如何处理的?
文章作者:Keyle
发布时间:2025-08-07
最后更新:2025-08-07
原始链接:https://vrast.cn/posts/60644/
版权声明:©Keyle's Blog. 本站采用署名-非商业性使用-相同方式共享 4.0 国际进行许可
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。