Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Module 如何要求Lua中已加载的模块_Module_Lua - Fatal编程技术网

Module 如何要求Lua中已加载的模块

Module 如何要求Lua中已加载的模块,module,lua,Module,Lua,我有一个Lua模块,它返回一个导出表(即不使用不推荐使用的module指令)。另外,我有一个脚本,希望通过“require”函数加载该模块。 现在我将这两个文件从C代码加载到lua状态,如下所示: luaL_loadstring(lua, someScript); lua_pcall(lua, 0, LUA_MULTRET, 0); luaL_loadstring(lua, someModule); lua_pcall(lua, 0, LUA_MULTRET, 0); require调用失败,

我有一个Lua模块,它返回一个导出表(即不使用不推荐使用的module指令)。另外,我有一个脚本,希望通过“require”函数加载该模块。 现在我将这两个文件从C代码加载到lua状态,如下所示:

luaL_loadstring(lua, someScript);
lua_pcall(lua, 0, LUA_MULTRET, 0);
luaL_loadstring(lua, someModule);
lua_pcall(lua, 0, LUA_MULTRET, 0);
require调用失败,因为它查找的是文件,而不是已经加载的代码。在这种情况下,是否可能需要someScript中的someModule?

包含执行此操作所需的所有信息。具体来说,它告诉您
require
函数用于查找所请求代码的方法。更具体地说,关于
package.loaded
的第一句话可能是您需要注意的

以上链接中的文档:

加载给定的模块。函数首先查看package.loaded表以确定modname是否已加载。如果是,则require返回存储在package.loaded[modname]中的值。否则,它将尝试查找模块的加载程序

要查找加载程序,require由package.loaders数组引导。通过更改此数组,我们可以更改require查找模块的方式。以下解释基于package.loaders的默认配置

首先需要查询包。预加载[modname]。如果它有一个值,这个值(应该是函数)就是加载程序。否则,需要使用package.path中存储的路径搜索Lua加载程序。如果同样失败,它将使用package.cpath中存储的路径搜索C加载程序。如果同样失败,它将尝试一个多功能加载器(参见package.loaders)

一旦找到加载程序,require将使用单个参数modname调用加载程序。如果加载程序返回任何值,require将返回的值分配给package.loaded[modname]。如果加载器未返回任何值,并且未向package.loaded[modname]分配任何值,则require会将true分配给此条目。在任何情况下,require都会返回package.loaded[modname]的最终值

如果加载或运行模块时出错,或者找不到模块的任何加载程序,则需要发出错误信号


为了清楚起见,让我们命名一下:模块A返回一个导出表;脚本B是一个需要模块a的字符串,我假设B不返回任何内容。您还需要执行以下操作:

load script B (via luaL_loadstring): puts chunk on stack
run chunk for script B (via lua_pcall): puts whatever B returns on stack
load module A (via luaL_loadstring): puts chunk on stack
run module A (via lua_pcall): puts whatever A returns on stack
首先,模块A是一个文件,因此您可能已经将模块A的内容加载到字符串中

您说您的问题是,脚本B中调用的require失败了。可能有几个原因,例如B确实需要“moduleA”,但在lua_路径文件夹中找不到moduleA.lua

因此:

  • 打印B中需要A的部分,以便查看代码
  • 验证LUA_路径是否可以找到moduleA.LUA

一旦确认以上内容没有问题,我们可以查看您的C API调用,但我怀疑这些是问题所在

如果
someModule
使用
require“modname”
请尝试以下代码:

lua_getglobal(lua, "package");
lua_getfield(lua, -1, "loaded");
luaL_loadstring(lua, someScript);
lua_pcall(lua, 0, 1, 0);
lua_setfield(lua, -2, modname);
luaL_loadstring(lua, someModule);
lua_pcall(lua, 0, LUA_MULTRET, 0);

嗯,模块中的最后一条语句返回一个导出表。据我所知,需要一个文件会以某种方式调用return语句,并在package.loaded中设置结果。我不明白的是,当文件已经加载时,如何访问导出表?您的模块返回一个表。当您调用
luaL\u loadstring
时,它会在堆栈上放置一个可调用的块/函数(该函数表示您的文件)。当您
lua_pcall
该函数运行文件中的代码时,它将返回文件返回的任何内容。在本例中,它似乎是一个表。这是您需要的表格,也需要返回。我的问题和澄清请求不适合评论,因此请在问题中提出,我将根据您的澄清(顺便说一句,您应该在问题中提出,而不是在评论中提出)扩展回答