我一直在回避一个事情,那就是对嵌套Table的处理。例如在Lua中有如下定义:

luat_Nest= {a=123, b=456, c={1,2,3}}

    其中,成员C就是嵌套的。在C/C++中如何处理呢?其实,对于这种仅仅嵌套一层的表还是比较容易处理的。下面的代码就可以:

代码

NestTable.cpp

 #include <lua.hpp>

static void ReadNestTable(lua_State *L, const char* lpszTableName, const char* lpszTableItem, int index)
{
    lua_getglobal(L, lpszTableName);
    lua_pushstring(L, lpszTableItem);
    lua_gettable(L, -2);

    lua_rawgeti(L, -1, index);
    printf("%s.%s[%d]=%d\n", lpszTableName, lpszTableItem, index, (int)lua_tonumber(L, -1));
    lua_pop(L, 3);
}

static void WriteNestTable(lua_State *L, const char* lpszTableName, const char* lpszTableItem, int index, int val)
{
    lua_getglobal(L, lpszTableName);
    lua_pushstring(L, lpszTableItem);
    lua_gettable(L, -2);

    lua_pushnumber(L, val);
    lua_rawseti(L, -2, index);
    lua_pop(L, 1);
}

int main (int argc, char* argv[])
{
    lua_State *L = lua_open();
    luaopen_base(L);

    luaL_dofile(L, "NestTable.lua");
    ReadNestTable(L, "luat_Nest", "c", 1);  // print(luat_Nest.c[1])
    ReadNestTable(L, "luat_Nest", "c", 2);  // print(luat_Nest.c[2])
    ReadNestTable(L, "luat_Nest", "c", 3);  // print(luat_Nest.c[3])

    WriteNestTable(L, "luat_Nest", "c", 1, 9); // luat_Nest.c[1] = 9
    WriteNestTable(L, "luat_Nest", "c", 2, 8); // luat_Nest.c[2] = 8
    WriteNestTable(L, "luat_Nest", "c", 3, 7); // luat_Nest.c[3] = 7
    puts("-------------------------");
    ReadNestTable(L, "luat_Nest", "c", 1);
    ReadNestTable(L, "luat_Nest", "c", 2);
    ReadNestTable(L, "luat_Nest", "c", 3);
    lua_close(L);
    return 0;
}

测试环境

类型
操作系统 Ubuntu 10.10
lua 5.1.4

运行结果

图片7.png

但是,对于那些多层嵌套的表格呢?例如:

luat_Nest = {a={b={c={123, 456, 789}}}}

    处理起来就复杂多了。我的处理办法是封装成一个类(CLuaTable)出来,然后一层一层的读取下去。但是,很可惜,由于lua与C/C++交互的时候使用的是栈,当我们需要读取luat_Nest.a.b.c1时不得不先从全局表中找到luat_Nest并压入栈,然后再将a、b、c依次压栈,最后再读取成员。对于线性遍历还好说,没啥好说的。而对于随机访问,效率就会是个问题了。所以,在实际项目中最好还是别用嵌套的Table,不仅复杂度高。效率还差。
    限于篇幅,CLuaTable类的代码,我就不贴出来了。