我有这样的文件设置:
main.lua (requires 'mydir.b' and then 'b')
b.lua
mydir/
b.so (LuaJIT C module)
从主要方面来说,我这样做:
function print_loaded()
for k, v in pairs(package.loaded) do print(k, v) end
end
print_loaded()
require 'mydir.b'
print_loaded()
-- This would now include 'mydir.b' instead of 'b':
local b = require 'b'
print
的输出显示我对require 'mydir.b'
的调用是将返回值设置为package.loaded['b']
的值以及预期的package.loaded['mydir.b']
。我希望package.loaded['b']
保持未设置状态,以便我可以稍后require 'b'
而不是mydir.b
的(我认为错误的)缓存值。
我的问题是:处理这个问题的好方法是什么?
在我的情况下,我希望能够复制mydir
作为我的任何LuaJIT项目的子目录,而不必担心mydir.whatever
通过破坏任何后来的require
来污染模块命名空间{在父目录级别{1}} {1}}。
期待有人说,“只需重命名你的模块!”是。我能做到。但我很想知道是否有一个更好的解决方案,让我根本不必担心名称冲突。
答案 0 :(得分:1)
问题是我在luaL_register
的源文件(b.so
)中错误地调用了b.c
。
以下是导致问题的错误代码:
static const struct luaL_reg b[] = {
/* set up a list of function pointers here */
};
int luaopen_mydir_b(lua_State *L) {
luaL_register(L, "b", b); // <-- PROBLEM HERE (see below)
return 1; // 1 = # Lua-visible return values on the stack.
}
突出显示的行的问题是,它会专门设置package.loaded['b']
以在加载时获得此模块的返回值。这可以通过用以下代码替换行来解决:
luaL_register(L, "mydir.b", b);
将改为设置package.loaded['mydir.b']
,从而为以后使用具有相同名称的模块留出空间(没有mydir
前缀)。
直到我问这个问题很久之后,我才意识到这一点,当我终于开始阅读Lua 5.1的官方docs for luaL_register
时,这是LuaJIT遵守的版本。