【发布时间】:2015-07-04 10:18:00
【问题描述】:
我有这样的文件设置:
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'
prints 的输出表明我对require 'mydir.b' 的调用将返回值设置为package.loaded['b'] 的值以及预期的package.loaded['mydir.b']。我想让package.loaded['b'] 保持未设置,以便我以后可以require 'b' 而不是最终得到来自mydir.b 的(我认为不正确的)缓存值。
我的问题是:有什么好的方法来解决这个问题?
就我而言,我希望能够将mydir 复制为我的任何LuaJIT 项目的子目录,而不必担心mydir.whatever 会通过销毁以后的requires 来污染模块命名空间whatever 在父目录级别。
预期人们会说,“只需重命名您的模块!”是的。我能做到。但我很想知道是否有更好的解决方案让我根本不必担心名称冲突。
【问题讨论】:
-
你的
b.lua是否有机会使用module函数? -
不,它没有。此行为似乎与
b.lua的内容无关。 -
b.so库是否在任何地方设置了packages.loaded(例如使用module)? -
不,
b.so不会在任何地方使用module。但!它确实调用了luaL_register,这可能是导致问题的原因!感谢您帮助我意识到这一点。我会写一个答案。