主要內容轉載自:子龍山人博客(強烈建議去子龍山人博客完全學習一遍)
部分內容查閱自:《Lua 5.3 參考手冊》中文版 譯者 雲風 制作 Kavcc
vs2013+lua-5.3.3
1.數組
①數組是key值從1開始並連續遞增的table。
②索引號是從1開始,不是從0開始。
2.既然是table,那當然是可以用上一節的內容進行讀寫的。
lua還提供了一些只針對數組進行操作的API,如下:
①LUALIB_API lua_Integer (luaL_len) (lua_State *L, int idx);
使用於數組,可得到數組元素個數;
以數字形式返回給定索引處值的“長度”; 它等價於在 Lua 中調用 '#' 的操作。(非數組使用#將得不到正確的值)
如果操作結果不是一個整數,則拋出一個錯誤。(這種情況只發生在觸發元方法時。)
②LUA_API int (lua_rawgeti) (lua_State *L, int idx, lua_Integer n);
注意對應的lua_rawget函數。
獲取索引號n的數組值,返回的int值為值的類型。
這是一次直接訪問,不會觸發元方法,效率高。
③LUA_API void (lua_rawseti) (lua_State *L, int idx, lua_Integer n);
注意對應的lua_rawset函數
設置索引號n的數組值。
這個函數會將值彈出棧。 賦值是直接的;即不會觸發元方法,效率高。
3.C++讀取Lua中數組
①Lua中數組
global_c_read_array = {5,6.78,"array string"}
②C++中讀取
1 //lua->stack,得到全局數組,位置-1
2 lua_getglobal(L, "global_c_read_array"); 3
4 //得到數組長度
5 lua_Integer array_len = luaL_len(L, -1); 6 for (lua_Integer i = 1; i <= array_len; ++i){ 7 //lua->stack,全局數組位置-1,然后i為對應的索引值,將返回值放到-1的位置
8 int ret_type = lua_rawgeti(L, -1, i); 9
10 //--------------被替代的原操作table函數------------- 11 //lua_pushinteger(L, i); 12 //int ret_type = lua_gettable(L, -2); //也可以使用int ret_type = lua_rawget(L, -2); 13
14 //stack->c
15 if (ret_type == LUA_TNUMBER){ 16 if (lua_isinteger(L, -1)){ 17 printf("%lld\n", lua_tointeger(L, -1)); 18 } 19 else if (lua_isnumber(L, -1)){ 20 printf("%g\n", lua_tonumber(L, -1)); 21 } 22 } 23 else if (ret_type == LUA_TSTRING){ 24 printf("%s\n", lua_tostring(L, -1)); 25 } 26
27 lua_pop(L, 1); 28 }
4.C++寫入Lua數組
①C++寫入
1 //c->stack,創建一個新的table放到-1的位置
2 lua_newtable(L); 3
4 //c->stack,創建對應的key-val
5 lua_pushinteger(L, 7); //設置值
6 lua_rawseti(L, -2, 1);//對應key-val
7
8 lua_pushnumber(L, 8.9); //設置值
9 lua_rawseti(L, -2, 2);//對應key-val
10
11 lua_pushstring(L, "test_string");//設置值
12 lua_rawseti(L, -2, 3);//對應key-val 13
14 //--------------被替代的原操作table函數------------- 15 //lua_pushinteger(L, 1); //設置key 16 //lua_pushinteger(L, 7);//設置值 17 //lua_settable(L, -3); //也可以使用lua_rawset(L,-3); 18
19 //lua_pushinteger(L, 2); //設置key 20 //lua_pushnumber(L, 8.9);//設置值 21 //lua_settable(L, -3); //也可以使用lua_rawset(L,-3); 22
23 //lua_pushinteger(L, 3); //設置key 24 //lua_pushstring(L, "test_string");//設置值 25 //lua_settable(L, -3); //也可以使用lua_rawset(L,-3); 26
27
28 //stack->lua,將數組賦值到lua中,並彈出數組
29 lua_setglobal(L, "global_c_write_array");
②在hello.lua文件中Lua讀取
1 if global_c_write_array then
2 for i = 1, #global_c_write_array do
3 print("v = ", global_c_write_array[i]) 4 end
5 end
Lua和C++交互系列:
《Lua和C++交互 學習記錄之七:C++全局函數注冊為Lua模塊》