• lua State加载部分库


        在lua中,通常我们用luaL_openlibs(L)加载所有的lub标准库,但是有时候我们想只加载部分,有没有什么好的办法呢?在luaproc看到如下办法:

    static void registerlib( lua_State *L, const char *name, lua_CFunction f ) {
        lua_getglobal( L, "package" );
        lua_getfield( L, -1, "preload" );
        lua_pushcfunction( L, f );
        lua_setfield( L, -2, name );
        lua_pop( L, 2 );
    }
    
    static void openlibs( lua_State *L ) {
        lua_cpcall( L, luaopen_base, NULL );
        lua_cpcall( L, luaopen_package, NULL );
        registerlib( L, "io", luaopen_io );
        registerlib( L, "os", luaopen_os );
        registerlib( L, "table", luaopen_table );
        registerlib( L, "string", luaopen_string );
        registerlib( L, "math", luaopen_math );
        registerlib( L, "debug", luaopen_debug );
    }
    int lua_cpcall (lua_State *L, lua_CFunction func, void *ud);

    Calls the C function func in protected mode. func starts with only one element in its stack, a light userdata containing ud. In case of errors, lua_cpcall returns the same error codes as lua_pcall, plus the error object on the top of the stack; otherwise, it returns zero, and does not change the stack. All values returned by func are discarded.

    上面是5.1的做法。luaproc新做法如下:

     static void luaproc_reglualib( lua_State *L, const char *name,
                                    lua_CFunction f ) {
       lua_getglobal( L, "package" );
       lua_getfield( L, -1, "preload" );
       lua_pushcfunction( L, f );
       lua_setfield( L, -2, name );
       lua_pop( L, 2 );
     }
     
     static void luaproc_openlualibs( lua_State *L ) {
       requiref( L, "_G", luaopen_base, FALSE );
       requiref( L, "package", luaopen_package, TRUE );
       luaproc_reglualib( L, "io", luaopen_io );
       luaproc_reglualib( L, "os", luaopen_os );
       luaproc_reglualib( L, "table", luaopen_table );
       luaproc_reglualib( L, "string", luaopen_string );
       luaproc_reglualib( L, "math", luaopen_math );
       luaproc_reglualib( L, "debug", luaopen_debug );
     #if (LUA_VERSION_NUM == 502)
       luaproc_reglualib( L, "bit32", luaopen_bit32 );
     #endif
     #if (LUA_VERSION_NUM >= 502)
       luaproc_reglualib( L, "coroutine", luaopen_coroutine );
     #endif
     #if (LUA_VERSION_NUM >= 503)
       luaproc_reglualib( L, "utf8", luaopen_utf8 );
     #endif
     
     }
     
  • 相关阅读:
    C#扩展方法学习
    如何用PS快速做出3D按钮效果的图片
    比较C#中几种常见的复制字节数组方法的效率[转]
    GUID的学习
    委托与事件的区别
    利用Marshal.AllocHGlobal申请非托管内存,unsafe代码
    JAVASE(十三) 异常处理
    JAVASE(十二) Java常用类: 包装类、String类、StringBuffer类、时间日期API、其他类
    JAVASE(十一) 高级类特性: abstract 、模板模式、interface、内部类、枚举、注解
    面试题: SpringBoot 的自启动原理
  • 原文地址:https://www.cnblogs.com/youxin/p/4918113.html
Copyright © 2020-2023  润新知