在子目录中要求 LuaJIT 模块会覆盖父目录中的同名模块
Requiring a LuaJIT module in a subdir is overwriting a module of the same name in the parent dir
我有这样的文件设置:
main.lua (requires 'mydir.b' and then 'b')
b.lua
mydir/
b.so (LuaJIT C module)
从 main 开始,我这样做:
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'
的调用将 return 值设置为 package.loaded['b']
的值以及预期的 package.loaded['mydir.b']
。我想让 package.loaded['b']
保持不变,这样我以后就可以 require 'b'
而不是以 mydir.b
.
中的缓存值(在我看来是错误的)结束
我的问题是:处理这个问题的好方法是什么?
在我的例子中,我希望能够复制 mydir
作为我的任何 LuaJIT 项目的子目录,而不必担心 mydir.whatever
通过破坏任何东西来污染模块名称空间稍后在父目录级别 whatever
的 require
秒。
期待人们说,"just rename your modules!"是的。我能做到。但我很想知道是否有更好的解决方案,让我根本不必担心名称冲突。
问题是我在 b.so
的源文件 (b.c
) 中错误地调用了 luaL_register
。
这是导致问题的错误代码:
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']
以具有此模块的 return 值。这可以通过用这个替换行来解决:
luaL_register(L, "mydir.b", b);
这将改为设置 package.loaded['mydir.b']
,从而为以后使用同名模块(没有 mydir
前缀)留出空间。
直到我问了这个问题很久之后我才意识到这一点,当我终于抽出时间阅读 Lua 5.1 的官方 docs for luaL_register
,即版本 Lua JIT 符合.
我有这样的文件设置:
main.lua (requires 'mydir.b' and then 'b')
b.lua
mydir/
b.so (LuaJIT C module)
从 main 开始,我这样做:
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'
的调用将 return 值设置为 package.loaded['b']
的值以及预期的 package.loaded['mydir.b']
。我想让 package.loaded['b']
保持不变,这样我以后就可以 require 'b'
而不是以 mydir.b
.
我的问题是:处理这个问题的好方法是什么?
在我的例子中,我希望能够复制 mydir
作为我的任何 LuaJIT 项目的子目录,而不必担心 mydir.whatever
通过破坏任何东西来污染模块名称空间稍后在父目录级别 whatever
的 require
秒。
期待人们说,"just rename your modules!"是的。我能做到。但我很想知道是否有更好的解决方案,让我根本不必担心名称冲突。
问题是我在 b.so
的源文件 (b.c
) 中错误地调用了 luaL_register
。
这是导致问题的错误代码:
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']
以具有此模块的 return 值。这可以通过用这个替换行来解决:
luaL_register(L, "mydir.b", b);
这将改为设置 package.loaded['mydir.b']
,从而为以后使用同名模块(没有 mydir
前缀)留出空间。
直到我问了这个问题很久之后我才意识到这一点,当我终于抽出时间阅读 Lua 5.1 的官方 docs for luaL_register
,即版本 Lua JIT 符合.