Lua和C++交互 学习记录之五:全局数组交互
主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍)
部分内容查阅自:《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模块》