主要內容轉載自:子龍山人博客(強烈建議去子龍山人博客徹底學習一遍)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模塊》
《Lua和C++交互 學習記錄之八:C++類註冊爲Lua模塊》