是否可以require()使用luaL_loadstring()加载的脚本?

时间:2018-06-17 12:45:59

标签: module lua require

我是Lua的初学者。

我想知道是否可以使用require('filename')来要求使用luaL_loadstring()加载的脚本。

由于luaL_loadstring(lua_State *L, const char *s)未指定任何文件名,因此我不知道如何使用require()从其他脚本加载此脚本。

require()仅适用于实际的.lua个文件吗?

2 个答案:

答案 0 :(得分:2)

好吧,看看the documentation for require(),你会发现它非常灵活。

相关部分是:

  1. package.loaded[modname]。只需使用您想要的模块名称进行设置即可。请确保在require之前设置它。
  2. package.searchers及其中的默认条目。仅当模块未按上述方式注册为已加载时,此选项才有意义。
  3. 更详细:

    如果你想设置一个包来找到它,你有两个选择:1。通过将它添加到package.loaded来设置为满载,或者2.确保它是由一个找到的package.searchers - 条目 Any competent lua modules tutorial将告诉您如何轻松地构建模块本身,文档为您提供了原因的机制 The registry, which contains an entry for the global environment,可以从本机代码访问,因此如果您愿意,可以从那里进行。

答案 1 :(得分:1)

luaL_loadstring创建一个Lua函数,当调用它时,执行它给出的字符串。我们可以使用这个事实,因为Lua C模块也只是调用一个函数luaopen_MODULE。此函数返回包含模块内容的表。也就是说,如果我们想通过luaL_loadstring加载模块,那么作为字符串给出的脚本必须返回一个表。剩下要做的唯一事情就是让口译员知道在哪里找到模块。因此,我们只需在package.preload中创建一个条目。

有趣的部分是在破折号之间。其余的只是让解释器运行的样板。 (可能无法在5.1中工作)

#include <stdio.h>

#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>

int main(int argc, char *argv[]) {
    if (argc != 2) {
        fprintf(stderr, "Usage: %s <script.lua>\n", argv[0]);
        return 1;
    }

    lua_State * L = luaL_newstate();
    luaL_openlibs(L);

    // ---- Register our "fromstring" module ----
    lua_getglobal(L, "package");
    lua_getfield(L, -1, "preload");
    luaL_loadstring(L, "return { test = function() print('Test') end }");
    lua_setfield(L, -2, "fromstring");
    // ------------------------------------------

    if (luaL_dofile(L, argv[1]) != 0) {
        fprintf(stderr,"lua: %s\n", lua_tostring(L, -1));
        lua_close(L);
        return 1;
    }

    lua_close(L);
}

输入脚本:

local fromstring = require("fromstring")
fromstring.test()

输出:

Test