前面学习了如何使用Lua
Api操作虚拟栈的栈顶操作,但是仍旧不清楚如何操作栈中的数据,如何获取数据,如何操作数据等等。本文将介绍如何向栈中压入数据。
前言
向Lua
栈中压入数据,首先得知道Lua中有哪一些数据类型,每种数据类型提供了哪些方式入栈。
Lua提供了以下几种常用数据类型:
-
nil
:Nil是nil类型,用来表示一个有意义的值不存在时的状态 -
boolean
:false与true两个值得类型 -
number
:代表整数与浮点数 -
string
:表示一个不可变的字节序列,可以包含('\0')
Lua中还有一些其它数据类型比如function
、userdata
、thread
和table
,不在本文介绍,有机会将在后续介绍。
函数方法
下面针对上面提到的几种数据结构介绍相应的入栈的API
nil 入栈
void lua_pushnil (lua_State *L);
作用:顾名思义,将空值入栈
boolean 入栈
void lua_pushboolean (lua_State *L, int b);
作用:将b
作为一个布尔量入栈
number 入栈
void lua_pushnumber (lua_State *L, lua_Number n);
作用:将一个值为n
的浮点数入栈
string 入栈
const char *lua_pushlstring (lua_State *L, const char *s, size_t len);
作用:把指针s
指向长度为len
的字符串压栈。Lua会对这个字符串做一个副本,因此s
可以在函数返回后释放或作其他用,函数返回字符串的副本
const char *lua_pushstring (lua_State *L, const char *s);
作用:将指针s
指向的零结尾的字符串压栈。 因此s
处的内存在函数返回后,可以释放掉或是立刻重用于其它用途。返回字符串的副本。
其他入栈方式
void lua_pushvalue (lua_State *L, int index);
作用:把栈上给定索引处的元素作一个副本压栈,等于拷贝index
处的元素入栈
void lua_remove (lua_State *L, int index);
作用:移除指定索引的元素,并将其上面所有的元素下移来填补这个位置的空白。
void lua_insert (lua_State *L, int index);
作用:移动栈顶元素到指定索引的位置,并将这个索引位置上面的元素全部上移至栈顶被移动留下的空隔。
void lua_replace (lua_State *L, int index);
作用:从栈顶弹出元素值并将其设置到指定索引位置,没有任何移动操作。
示例
C 使用 Lua API
/*
* gcc test.c -llua -lm -ldl
*/
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
#include <stdio.h>
/*
* 从栈底到栈顶依次遍历整个堆栈
*/
static void stackDump(lua_State* L)
{
int i;
int top = lua_gettop(L);
for(i = 1; i <= top; ++i)
{
int t = lua_type(L, i);
switch(t)
{
case LUA_TSTRING:
printf("'%s'", lua_tostring(L, i));
break;
case LUA_TBOOLEAN:
printf(lua_toboolean(L, i) ? "true": "false");
break;
case LUA_TNUMBER:
printf("'%g'", lua_tonumber(L, i));
break;
default:
printf("'%s'", lua_typename(L, t));
break;
}
printf(" ");
}
printf("\n");
}
int main(int argc, char *argv[])
{
lua_State *L = lua_open();
luaL_openlibs(L);
lua_pushboolean(L, 1);
lua_pushnumber(L, 10);
lua_pushnil(L);
lua_pushstring(L, "Hello");
lua_pushlstring(L, "World!!!", 6);
stackDump(L);
lua_pushvalue(L, -4);
stackDump(L);
lua_remove(L, 3);
stackDump(L);
lua_insert(L, -2);
stackDump(L);
lua_replace(L, 1);
stackDump(L);
lua_close(L);
return 0;
}
编译执行输出为:
true '10' 'nil' 'Hello' 'World!'
true '10' 'nil' 'Hello' 'World!' '10'
true '10' 'Hello' 'World!' '10'
true '10' 'Hello' '10' 'World!'
'World!' '10' 'Hello' '10'
总结
Lua
栈操看起来并不复杂,用好就见仁见智了,下一篇文章将介绍,获取栈中数据的API。