表的操作
上面的列表中并没有lua_pushtable和lua_totable,那么怎样取得或设置Lua中的table数据呢?
在Lua中,table是一个很重要的数据类型,在table中不仅可以象C中的数据一样放一组数据,还可以象
map一样以key=value的方式存放数据,如Lua代码中的:
tb = {"abc",12,true,x=10,y=20,z=30}
前三个数据可以用tb[1]~tb[3]取得而后三个数据通过tb.x,tb.y,tb.z取得
尽管看起来很牛叉,不过剥开神奇的外衣,实际上Lua的table中,所有的数据都是以key=value的形式
存放的,这句Lua代码也可以写成:
tb = {[1]="abc",[2]=12,[3] = true,["x"]=10,["y"]=20,["z"]=30}
它的形式就是[key]=value,所谓的tb.x只是tb["x"]的语法糖而已,如果愿意,也可以用tb["x"]取得
这个数据10。
我们把上面的例子改成使用表的.
int main() { //Lua示例代码,使用table char *szLua_code = "x = {} --用于存放结果的table " "x[1],x[2] = string.gsub(c.Str,c.Mode,c.Tag) --x[1]里是结果,x[2]里是替换次数 " "x.u = string.upper(x[1])"; //Lua的字符串模式 char *szMode = "(%w+)%s*=%s*(%w+)"; //要处理的字符串 char *szStr = "key1 = value1 key2 = value2"; //目标字符串模式 char *szTag = "<%1>%2</%1>"; lua_State *L = luaL_newstate(); luaL_openlibs(L); //把一个tabele送给Lua lua_newtable(L); //新建一个table并压入栈顶 lua_pushstring(L,"Mode");// key lua_pushstring(L,szMode);// value //设置newtable[Mode]=szMode //由于上面两次压栈,现在table元素排在栈顶往下数第三的位置 lua_settable(L,-3); //lua_settable会自己弹出上面压入的key和value lua_pushstring(L,"Tag");// key lua_pushstring(L,szTag);// value lua_settable(L,-3); //设置newtable[Tag]=szTag lua_pushstring(L,"Str");// key lua_pushstring(L,szStr);// value lua_settable(L,-3); //设置newtable[Str]=szStr lua_setglobal(L,"c"); //将栈顶元素(newtable)置为Lua中的全局变量c //执行 bool err = luaL_loadbuffer(L,szLua_code,strlen(szLua_code),"demo") || lua_pcall(L,0); if(err) { //如果错误,显示 cerr << lua_tostring(L,-1); //弹出栈顶的这个错误信息 lua_pop(L,1); } else { //Lua执行后取得全局变量的值 lua_getglobal(L,"x"); //这个x应该是个table if(lua_istable(L,-1)) { //取得x.u,即x["u"] lua_pushstring(L,"u"); //key //由于这次压栈,x处于栈顶第二位置 lua_gettable(L,-2); //lua_gettable会弹出上面压入的key,然后把对应的value压入 //取得数据,然后从栈中弹出这个value cout << "x.u = " << lua_tostring(L,-1) << endl; lua_pop(L,1); //取得x[1]和x[2] for(int i=1; i<=2; i++) { //除了key是数字外,与上面的没什么区别 lua_pushnumber(L,i); lua_gettable(L,-2); cout << "x[" << i <<"] = " << lua_tostring(L,-1) << endl; lua_pop(L,1); } } //弹出栈顶的x lua_pop(L,1); } lua_close(L); return 0; }