当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《省略Lua标准库的最佳方法是什么?》经验,为你挑选了2个好方法。

删除或省略Lua标准库包的最佳方法是什么?例如,删除特定环境中的os库函数.有问题的项目是从源文件构建Lua,所以我可以编辑源代码,尽管如果可能的话我宁愿通过API来完成.



1> RBerteig..:

请参阅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()不是强制性的.相反,只显示您想要的库.

参考手册的第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.它应该传递一个参数:一个包含模块已知名称的字符串.基本模块是一个例外,它传递一个空字符串,因为它没有实际名称.

这是一个创建新Lua状态并仅打开基础库和包库的函数:

#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失败时返回新的.


此代码示例中的三元组(pushcfunction/pushstring/call)基本上是luaL_requiref()的缩短版本,如果您使用5.2,则应该使用它.请参阅lua源代码树中的lauxlib.c

2> Jonathan Zra..:

假设您只想打开basepackage库.在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工作方式,除了它加载所有东西.

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有