加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在子目录中需要LuaJIT模块会覆盖父目录中的同名模块

发布时间:2020-12-14 21:43:53 所属栏目:大数据 来源:网络整理
导读:我有这样的文件设置: main.lua (requires 'mydir.b' and then 'b')b.luamydir/ b.so (LuaJIT C module) 从main,我这样做: function print_loaded() for k,v in pairs(package.loaded) do print(k,v) endendprint_loaded()require 'mydir.b'print_loaded()-
我有这样的文件设置:

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'

打印输出显示我要求’mydir.b’的调用将返回值设置为package.loaded [‘b’]的值以及预期的package.loaded [‘mydir.b’].我想让package.loaded [‘b’]保持未设置状态,以便稍后我可以要求’b’而不是最终得到mydir.b中的(在我看来不正确)缓存值.

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

在我的情况下,我希望能够复制mydir作为我的任何LuaJIT项目的子目录,而不必担心mydir.whatever通过破坏任何以后在父目录级别的任何需求来污染模块命名空间.

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

解决方法

问题是我在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’]以在加载时获得该模块的返回值.这可以通过用以下代码替换行来修复:

luaL_register(L,"mydir.b",b);

这将设置package.loaded [‘mydir.b’],从而为以后使用具有相同名称的模块留出空间(没有mydir前缀).

直到我问这个问题很久之后,我终于开始阅读Lua 5.1的官方docs for luaL_register,这是LuaJIT遵守的版本.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读