代码之家  ›  专栏  ›  技术社区  ›  Nick Van Brunt

省略Lua标准库的最佳方法是什么?

lua c
  •  13
  • Nick Van Brunt  · 技术社区  · 17 年前

    os library functions 在特定的环境中。这个项目正在从源文件构建Lua,所以我

    3 回复  |  直到 17 年前
        1
  •  31
  •   RBerteig Keith Adler    17 年前

    luaconf.h 在源代码工具包中,可以轻松访问大多数编译时配置,例如用于 lua_Number .

    查看文件 linit.c luaL_openlibs() .

    常见的做法是将该文件复制到应用程序的源代码,并对其进行修改以满足您的需求,称该副本为 luaL_openlibs() 代替核心版本。如果您正在私下编译Lua,并且没有链接到库的预构建二进制文件之一,那么您可以找到一种适合您需求的等效方法。

    当然,您也不需要编译或链接到任何库的源代码(例如 os ,发现于 loslib.c )你选择离开 luaL_openlibs() .

    你可能不能完全忽略的唯一库是提供以下内容的基础库 pairs() , ipairs() , pcall() , tostring() ,还有很多不方便的东西。当移植到其中一些有问题的环境时,通常最好仔细研究其在 lbaselib.c

    编辑:

    在解释器中包含不同库列表的另一种方法是不调用 luaL_openlibs() 完全。虽然像所有辅助库一样作为便利而提供, luaL_openlibs() 不是强制性的。相反,只显式打开您想要的库。

    Chapter 5 参考手册中谈到了这一点:

    C主机程序应调用 luaL_openlibs 功能,打开 它可以通过以下方式单独打开它们 luaopen_base (基本 图书馆), luaopen_package luaopen_string luaopen_table (对于表库), luaopen_math (用于数学库), luaopen_io (对于I/O库), luaopen_os (适用于操作系统 图书馆),以及 luaopen_debug 调试库)。这些功能是 声明于 lualib.h 不应该 与任何其他Lua C函数一样。, lua_call .

    最后一句话偶尔会引起麻烦,因为旧版本的Lua没有这种限制。每个单独的模块 luaopen_xxx() 函数遵循与 require

    #include "lua.h"
    #include "lualib.h"
    #include "lauxlib.h"
    
    lua_State *CreateBasicLua() {
        lua_State *L;
    
        L = luaL_newstate();
        if (L) {
            lua_pushcfunction(L, luaopen_base);
            lua_pushstring(L, "");
            lua_call(L, 1, 0);
            lua_pushcfunction(L, luaopen_package);
            lua_pushstring(L, LUA_LOADLIBNAME);
            lua_call(L, 1, 0);
        }
        return L;
    }
    

    它返回新的 lua_State 关于成功,或 NULL 失败。

        2
  •  10
  •   Jonathan Zrake    13 年前

    假设你只想打开 base package 图书馆。在Lua 5.2中,最简洁的方式是

    luaL_requiref(L, "_G", luaopen_base, 1);
    luaL_requiref(L, "package", luaopen_package, 1);
    lua_pop(L, 2);
    

    这就是luaL_openlibs函数在 linit.c

        3
  •  3
  •   Sirmabus Sirmabus    17 年前

    我认为这篇文章回答了你的问题,但也提供了更多关于这个主题的信息。 请注意,您也可以将整个表设置为“nil”。

    此外,如果你只想在“os”中单独取消“time”方法,你可以做“os.time=nil”。