gpt4 book ai didi

lua - 要求子目录中的 LuaJIT 模块会覆盖父目录中的同名模块

转载 作者:行者123 更新时间:2023-12-04 22:19:46 25 4
gpt4 key购买 nike

我有这样的文件设置:

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 的输出s 表明我调用 require 'mydir.b'将返回值设置为 package.loaded['b'] 的值以及预期的 package.loaded['mydir.b'] .我想要 package.loaded['b']未设置,以便我以后可以 require 'b'并且不会以 mydir.b 中的(在我看来是错误的)缓存值结束.

我的问题是:处理这个问题的好方法是什么?

就我而言,我希望能够复制 mydir作为我的任何 LuaJIT 项目的子目录,不必担心 mydir.whatever通过销毁以后的任何 require 来污染模块 namespace 的 whatever在父目录级别。

预计人们会说,“只需重命名您的模块!”是的。我能做到。但我很想知道是否有更好的解决方案让我根本不必担心名称冲突。

最佳答案

问题是我调用 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 前缀)留出空间。

直到我问了这个问题很久之后我才意识到这一点,当我终于有时间阅读官方 docs for luaL_register 对于 Lua 5.1,这是 LuaJIT 所遵循的版本。

关于lua - 要求子目录中的 LuaJIT 模块会覆盖父目录中的同名模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29870720/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com