【问题标题】:Is there any way that prevent lua from translating 'a.b' to 'a/b' when I require 'a.b'?当我需要'a.b'时,有什么方法可以防止lua将'a.b'翻译成'a/b'?
【发布时间】:2025-12-03 23:15:01
【问题描述】:

例如:

require('a.b.c/foo.lua')

Lua 引擎会将 'a.b.c/...' 转换为 'a/b/c/...' 以在模式列表中搜索文件,对吗? 当'a.b.c'是真正的文件夹名称时会有什么问题吗?如果有,如何解决?

【问题讨论】:

  • require 加载模块,而不是文件。您不能有一个名为 a.b.c 的文件夹。
  • 为什么我不能有一个名为a.b.c的文件夹?
  • 因为 Lua 将点转换为路径分隔符。错误消息显示:no file '/usr/local/share/lua/5.2/a/b/c/foo/lua.lua'
  • 是的,这就是我想弄清楚的问题的标题。

标签: lua require


【解决方案1】:

如果您的模块位于包含 . 作为其名称一部分的目录中,则使用 require 将其拉入将很困难,因为无法“逃避”.,因此 \ 替换没有完成。

但是,仍然可以通过玩package.path 来间接指向 lua 寻找正确的位置:

local restorepath = package.path
package.path = "./a.b.c/?.lua"
require 'foo'
package.path = restorepath

但我建议您首先尝试重新组织您的项目目录结构,以便更好地与 lua 的require 配合使用。否则,您将不得不继续与您可能拥有的其他模块一起进行上述舞蹈。

【讨论】:

    【解决方案2】:

    据我所知,此类翻译不在规范中。所以它可能工作,但也可能不工作。它可能会在某些平台上中断(即在 Linux 和 Mac 上工作,而不是在 Windows 上工作)。它可能在一个版本的 Lua 中有效,而在下一个版本中无效。所以我不会推荐它。

    确保您与平台无关的方法是在各处使用点。另外,我建议不要将.lua 部分放在最后,require 也不一定能很好地解决:

    require('a.b.c.foo')
    

    【讨论】:

    • 如果 'a.b.c' 是包含 foo.lua 的文件夹怎么办?
    • 将点转换为路径分隔符在手册中:lua.org/manual/5.2/manual.html#pdf-package.searchpath
    • @lfree: require('a.b.c.foo') 在这种情况下可以使用
    • 嗯,应该的。您是否删除了最后的“.lua”部分?
    • 你是对的!当我切断“.lua”后缀时,它确实有效。非常感谢! @_@
    最近更新 更多