Lua:require 未能找到子模块,但是 searchpath 可以成功?

通常,当我有一个与软件相关的问题时,我发现其他人已经问过完全相同的问题,并得到了对我有用的好答案。

但这一次,我未能找到答案来解决我的问题。

接下来就看看:我目前正在试图向上提升我的Lua编程能力,想要使用模块。所以,我有这样的一个结构:

main.lua
foo/bar.lua

现在,在main.lua中,我做了这个:

require("foo.bar")

但是失败了,

main.lua:1 module 'foo.bar' not found:
     no field package.preload['foo.bar']
     no file 'foo.bar.lua'
     no file 'foo.bar.lua'
     no file 'foo.lua'

好吧,我的package.path可能有问题,所以我使用package.searchpath("foo.bar", package.path)看看我错在哪里了。

问题在于,package.searchpathfoo.bar解析为foo/bar.lua,这完全正确。

据我所知,package.searchpath尝试像require一样找到模块,但在我的情况下似乎有一些问题。

令我感到奇怪的是,错误输出中“无文件'foo.bar.lua'”一词的重复。

我是否误解了require的用法?

我正在使用LuaJIT-2.0.0运行我的代码块


更新:

我正在使用LuaJIT-2.0.0运行我的代码块 <- 这是我的问题原因,标准Lua-5.2.2的行为符合预期

点赞
用户1857483
用户1857483
package.path = debug.getinfo(1,"S").source:match[[^@?(.*[\/])[^\/]-$]] .."?.lua;".. package.path

这行代码会让 require 在加载其他文件时搜索与当前文件相同的目录。如果你想要让它搜索当前目录的相对路径,那么可以在 "?.lua 之间插入相对路径。

下面是 require 的描述部分:

[...] 否则,require 会使用存储在 package.path 中的路径搜索 Lua 加载器。如果仍然失败,它会使用存储在 package.cpath 中的路径搜索 C 加载器。如果这也失败了,则尝试使用一个全部加载器(参见 package.loaders)。

package.path 的默认路径始终是执行指定脚本的 .exe 文件所在的路径。

2013-08-08 16:54:22