Lua和C++交互 学习记录之四:全局table交互
主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍)
部分内容查阅自:《Lua 5.3 参考手册》中文版 译者 云风 制作 Kavcc
vs2013+lua-5.3.3
1.C++读取Lua中的table
①在hello.lua中设置一个全局table:
global_c_read_table = {integer_val = 1,double_val = 2.34,string_val = "test_string"}
②在C++中读取
1 //lua->stack,得到全局表,位置-1
2 lua_getglobal(L, "global_c_read_table");
3
4 //-------------------得到第一个值----------------------------
5 //c->statck,设置key值,位置-1(上面的-1变为-2)
6 lua_pushstring(L, "integer_val");
7
8 //lua->statck,将-1位置的key值弹出,从lua中得到对应key的值,并将结果放在-1的位置
9 //如果没有值,则结果为TNIL
10 lua_gettable(L, -2);//返回值为值的类型
11
12 //statck->c
13 if (lua_isinteger(L, -1)){
14 printf("integer_val : %lld\n", lua_tointeger(L, -1));
15 }
16
17 //弹出-1位置的结果,之后全局表的位置恢复到-1
18 lua_pop(L, 1);
19
20 //-------------------重复上述步骤,得到第二个值----------------------------
21 lua_pushstring(L, "double_val");
22 lua_gettable(L, -2);//返回值为值的类型
23 if (lua_isnumber(L, -1)){
24 printf("double_val : %g\n", lua_tonumber(L, -1));
25 }
26 lua_pop(L, 1);
27 //-------------------重复上述步骤,得到第三个值----------------------------
28 lua_pushstring(L, "string_val");
29 lua_gettable(L, -2);//返回值为值的类型
30 if (lua_isstring(L, -1)){
31 printf("string_val : %s\n", lua_tostring(L, -1));
32 }
33 lua_pop(L, 1);
③lua_getfield函数
//使用lua_getfield代替lua_pushxxx和lua_gettable两个函数,返回值为值的类型
lua_getfield(L, -1, "integer_val");
在 Lua 中,这个函数可能触发对应 "index" 事件对应的元方法。
在后面的 绑定C++类在Lua中面向对象 会使用到其对应的lua_setfield方法。
2.C++将table写入Lua
①C++写入
1 //c->stack,创建一个新的table放到-1的位置
2 lua_newtable(L);
3
4 //c->stack,增加一个key,放在-1的位置,table位置变为-2
5 lua_pushstring(L, "integer_val");
6
7 //c->stack,增加key对应的值,放在-1位置,key位置变为-2,table位置变为-3
8 lua_pushinteger(L, 1);
9
10 //将key和val设置到table中,并弹出key和val,此时table位置变为-1
11 lua_settable(L, -3);
12
13 //stack->lua,将table赋值到lua中,并弹出table
14 lua_setglobal(L, "global_c_write_table");
②在hello.lua中进行Lua读取
1 for k,v in pairs(global_c_write_table) do
2 print("k = ",k," v = ",v)
3 end
3.其它常用table函数
①LUA_API int (lua_rawget) (lua_State *L, int idx);
类似于 lua_gettable , 但是作一次直接访问(不触发元方法),速度更快。
返回值为值的类型。
②LUA_API void (lua_rawset) (lua_State *L, int idx);
类似于 lua_settable , 但是是做一次直接赋值(不触发元方法),速度更快。
返回值为值的类型。
Lua和C++交互系列:
《Lua和C++交互 学习记录之七:C++全局函数注册为Lua模块》
《Lua和C++交互 学习记录之八:C++类注册为Lua模块》
《Lua和C++交互 学习记录之九:在Lua中以面向对象的方式使用C++注册的类》