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和C++交互 學習記錄之二:棧操作

 

Lua和C++交互 學習記錄之三:全局值交互

 

Lua和C++交互 學習記錄之四:全局table交互

 

Lua和C++交互 學習記錄之五:全局數組交互

 

Lua和C++交互 學習記錄之六:全局函數交互

 

Lua和C++交互 學習記錄之七:C++全局函數注冊為Lua模塊

 

Lua和C++交互 學習記錄之八:C++類注冊為Lua模塊

 

Lua和C++交互 學習記錄之九:在Lua中以面向對象的方式使用C++注冊的類

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM