• Lua中C API栈操作


    向栈中压入数据:

    lua_pushnil(lua_State*);

    lua_pushboolean(lua_State*, bool);

    lua_pushnumber(lua_State*, lua_Number);

    lua_pushinteger(lua_State*, lua_Integer)

    lua_pushlstring(lua_State*, const char*, size_t);

    lua_pushstring(lua_State*, const char*);

    获取栈中元素的类型

    lua_type(lua_State* L, int index);    

    类型包括 LUA_TNIL, LUA_TBOOLEAN, LUA_TNUMBER, LUA_TSTRING, LUA_TTABLE, LUA_TFUNCTION, LUA_TUSERDATA

    验证栈中的元素类型;

    lua_is*(lua_State* L, int index)

    其实有了lua_type()完全可以自己写类型验证的 每必要使用lua提供的API

    比如可以定义

     bool lua_is_number (lua_State* L, int index)  {
        return lua_type(L, index) == LUA_TNUMBER ? true : false;
     }

    所以完全是可以利用lua_type来自行定义对栈中元素的验证的。

    获取栈中元素的类型的字符串表示:

    lua_typename(lua_State*, int )这里的int值是通过lua_type()获取到的值

    其实这些都可以通过lua_type(lua_State*)来进行实现

    const char*  lua_type_str(int lua_type) {
        static char type[LUA_TYPE_LEN_MAX];
        switch (lua_type) {
            case  LUA_TNIL:
                strcpy(type, "nil");
            break;
    
            case  LUA_TBOOLEAN:
                strcpy(type, "boolean");
                break;
    
            case  LUA_TNUMBER:
                strcpy(type, "number");
                break;
    
            case  LUA_TSTRING:
                strcpy(type, "string");
                break;
    
            case  LUA_TTABLE:
                strcpy(type, "table");
                break;
    
            case  LUA_TTHREAD:
                strcpy(type, "thread");
                break;
    
            case  LUA_TFUNCTION:
                strcpy(type, "function");
                break;
    
            case  LUA_TUSERDATA:
                strcpy(type, "userdata");
                break;
    
            default:
                strcpy(type, "unknown");
                break;
        }
        return  type;
    }

    这样就可以实现你自己的栈元素类型的字符串显示了

    获取指定位置的元素可以使用lua_to*(lua_State*, int )

    int  lua_toboolean(lua_State*, int);

    lua_Number lua_tonumber(lua_State*, int);

    lua_Integer lua_tointeger(lua_State*, int );

    const char* lua_tolstring(lua_State*, int, size_t length);

    lua_gettop(lua_State*)      得到栈中元素的个数

    lua_settop(lua_State*, int index)

    设置栈中元素的个数,如果设置的值比当前栈中元素的个数多,则将多出的那部分全部丢弃,如果设置的值比当前栈中元素个数多,则将新加的值全部设置为nil.

    lua_pushvalue(lua_State*, int index) 将index位置的值的副本压入栈顶

    lua_remove(lua_State* L, int index)将指定位置的元素删除,并且其上的所有元素下移

    lua_insert(lua_State*, int index) 将指定位置之上的元素上移,空出该位置,并将栈顶元素移到此处

    lua_replace(lua_State*, int index)将栈顶元素弹出,并将其设置到指定的索引上。

    lua_pop是以一个宏的形式进行定义的

    #define    lua_pop(L, n)     lua_settop(L, -(n) - 1);

    比如弹出栈顶的元素则可以使用 lua_pop(L, 1)

  • 相关阅读:
    build.gradle文件详解<转> 推荐
    openGL 环境配置
    手写 大整数
    FOJ有奖月赛-2016年8月(daxia专场之过四题方有奖)
    2.1 基本计数方法
    第7章 代码
    第7章 高级数据结构的编程实验
    3.3 字符串(1)
    2016_NENU_CS_3
    3.2 区间信息的维护与查询
  • 原文地址:https://www.cnblogs.com/coder-zhang/p/3816638.html
Copyright © 2020-2023  润新知