使用Lua C API使用选择器字符串选择嵌套值

假设我在嵌套的表中定义了一个值:tab["m"]["b"] = {}。 在 Lua 中,我可以使用前面的语句来定义它。

C API 是否也可以这样做?具体来说,是否可以通过单个字符串 tab["m"]["b"] 来选择值,而不是逐个推送 tabm 等。

像使用单个值一样进行推送和选择(如下面的代码中所示)是不起作用的。

lua_pushstring(state, "tab[\"m\"][\"b\"]");
lua_gettable(state, LUA_GLOBALSINDEX);
点赞
用户485561
用户485561

这在 C API 中是不可能的。如果您需要此功能,可以添加一个帮助函数来完成:

/* 将 t[k_1][...][k_n] 推入栈中,其中 t 是给定索引处的值,
 * k_1,...,k_n 是栈顶的元素
 * (k_1 离栈顶最远,k_n 在栈顶)。
 */
void recursive_gettable(lua_State *L, int index, int n) /*[-n,+1,e]*/ {
    luaL_checkstack(L, 2, NULL);           /*[k_1,...,k_n]*/
    lua_pushvalue(L, index);               /*[k_1,...,k_n,t]*/
    for (int i = 1; i <= n; ++i) {
        lua_pushvalue(L, -(n+1)+(i-1));    /*[k_1,...,k_n,t[...][k_(i-1)],k_i]*/
        lua_gettable(L, -2);               /*[k_1,...,k_n,t[...][k_i]]*/
    }
    lua_replace(L, -1, -(n+1));            /*[t[...][k_n],k_2,...,k_n]*/
    lua_pop(L, n-1);                       /*[t[...][k_n]] */
}

/*usage:*/
luaL_checkstack(L, 3, NULL);
lua_pushstring(L, "tab");
lua_pushstring(L, "m");
lua_pushstring(L, "b");
recursive_gettable(L, LUA_GLOBALSINDEX, 3);
2014-05-24 22:05:35