Lua和C++交互 学习记录之四:全局table交互

主要内容转载自:子龙山人博客(强烈建议去子龙山人博客彻底学习一遍)html

部份内容查阅自:《Lua 5.3  参考手册》中文版 译者 云风 制做 Kavcc数组

 

vs2013+lua-5.3.3函数

 

1.C++读取Lua中的table学习

①在hello.lua中设置一个全局table:lua

global_c_read_table = {integer_val = 1,double_val = 2.34,string_val = "test_string"}

②在C++中读取spa

 

 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函数 code

//使用lua_getfield代替lua_pushxxx和lua_gettable两个函数,返回值为值的类型
lua_getfield(L, -1, "integer_val");

 

在 Lua 中,这个函数可能触发对应 "index" 事件对应的元方法。htm

在后面的 绑定C++类在Lua中面向对象 会使用到其对应的lua_setfield方法。对象

 

2.C++将table写入Luablog

①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和C++交互 学习记录之二:栈操做

 

Lua和C++交互 学习记录之三:全局值交互

 

Lua和C++交互 学习记录之四:全局table交互

 

Lua和C++交互 学习记录之五:全局数组交互

 

Lua和C++交互 学习记录之六:全局函数交互

 

Lua和C++交互 学习记录之七:C++全局函数注册为Lua模块

 

Lua和C++交互 学习记录之八:C++类注册为Lua模块

 

Lua和C++交互 学习记录之九:在Lua中以面向对象的方式使用C++注册的类

相关文章
相关标签/搜索