我有一个小C程序,其中包含一个必须代表Lua模块的字符串,它看起来像这样:
const char *lua_str = " local mymodule = {} \
function mymodule.foo() \
print(\"Hello World!\") \
end
return mymodule";
或者使用旧方式(,如果需要):
const char *lua_str = "module(\"mymodule\", package.seeall \
function foo() \
print(\"Hello World!\") \
end";
让我们假设这是我的小主机应用程序:
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
int main(int argc, char** argv)
{
lua_State *L = lua_open();
luaL_openlibs(L);
luaL_dostring(L, lua_str);
luaL_dofile(L, "test.lua");
return 0;
}
现在,在 test.lua 中,可以将该模块与静态名称一起使用,该名称不是由文件名决定的:
local mymodule = require "mymodule"
mymodule.foo()
基本上,我需要执行该字符串并为其指定一个代表实际模块名称的自定义名称。目前,名称由文件名决定,我不希望这样。
答案 0 :(得分:2)
如果你看documentation for require
:
加载给定的模块。该功能从查看开始 package.loaded表来确定modname是否已经加载。 如果是,则require返回存储的值 package.loaded [的modname]。否则,它会尝试找到一个加载器 模块。
要查找加载程序,require由package.loaders数组指导。通过 更改此数组,我们可以更改查找模块的方式。该 以下说明基于默认配置 package.loaders。
首先要求查询package.preload [modname]。如果它有一个值, 这个值(应该是一个函数)是加载器。除此以外 要求使用存储的路径搜索Lua加载程序 package.path。如果这也失败了,它会使用。搜索C loader 存储在package.cpath中的路径。如果这也失败了,它会尝试一个 一体化加载器(参见package.loaders)。
找到加载程序后,需要使用单个程序调用加载程序 参数,modname。如果加载器返回任何值,则需要分配 返回值为package.loaded [modname]。如果加载器返回 没有值,也没有为package.loaded [modname]赋值, 然后要求为此条目指定true。无论如何,要求退货 package.loaded [modname]的最终值。
如果加载或运行模块有任何错误,或者不能 找到模块的任何加载器,然后要求信号出错。
您将看到它详细解释了require
用于查找给定模块名称的代码的方法。该解释隐含的含义表明如何将任意加载(或可加载)代码块分配给您想要的任何给定名称。
具体来说,如果您在package.loaded[modname]
中设置一个值,则会立即返回该值。如果失败,package.preload[modname]
将被用作加载器(这是一个获取模块名称的函数)。