【问题标题】:Select nested value with selector string with the Lua C API使用 Lua C API 选择带有选择器字符串的嵌套值
【发布时间】:2014-07-14 00:42:11
【问题描述】:

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

C API 也可以吗?具体来说,不是单独推送tabm等,而是使用单个字符串tab["m"]["b"]选择值。

按下并选择它,就像使用单个值一样,(如下面的代码)不起作用。

lua_pushstring(state, "tab[\"m\"][\"b\"]");
lua_gettable(state, LUA_GLOBALSINDEX);

【问题讨论】:

    标签: c lua lua-api


    【解决方案1】:

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

    /* Pushes onto the stack the element t[k_1][...][k_n]
     * where t is the value at the given index and 
     * k_1, ..., k_n are the elements at the top of the stack
     * (k_1 being furthest from the top of the stack and
     *  k_n being at very the top of the stack).
     */
    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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-20
      • 1970-01-01
      • 2019-06-17
      • 2017-09-15
      相关资源
      最近更新 更多