[英]Select nested value with selector string with the Lua C API
假设我在嵌套表中定义了一个值: tab["m"]["b"] = {}
。 在Lua中,我可以使用前面的语句进行定义。
C API也可以吗? 具体来说,不是单独按下tab
, m
等,而是使用单个字符串tab["m"]["b"]
选择值。
像使用单个值一样进行推送和选择(如下面的代码)不起作用。
lua_pushstring(state, "tab[\"m\"][\"b\"]");
lua_gettable(state, LUA_GLOBALSINDEX);
这在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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.