如何从C语言中操作Lua表?

我需要在C中对 Lua 表执行操作,其中这些表被视为列表或队列。具体来说,我需要在头部插入一个元素并删除头部元素,使其他元素移动以适应新元素。

在纯 Lua 中,这很简单,我会使用 table.inserttable.remove。但在C中呢?

在 Lua C api 中有诸如 lua_settable 等函数,但没有公开的等价于 table.inserttable.remove。看起来解释器内部有一个叫做 tinserttremoveC函数,但它们不是 api 的一部分。

我真的必须调用执行此操作的 lua 函数吗?

原文链接 https://stackoverflow.com/questions/1044967

点赞
stackoverflow用户108130
stackoverflow用户108130

我相信您可以重用以下功能和宏,它们是在 ltablib.c 中:

static int tinsert (lua_State *L)
static int tremove (lua_State *L)
#define aux_getn(L,n)   (luaL_checktype(L, n, LUA_TTABLE), luaL_getn(L, n))

它们仅依赖于 Lua 的 API。请保留原有的 markdown 格式。

2009-06-25 17:08:38
stackoverflow用户41661
stackoverflow用户41661

代码未测试,但是这里有一个概要。您需要传入表的索引,对于插入函数,还需要传入要插入的值的索引。对于删除,值会被推到Lua栈上。

#define getn(L,n) (luaL_checktype(L, n, LUA_TTABLE), luaL_getn(L, n))

void insert_at_head (lua_State *L, int tbl_idx, int val_idx) {
  int e;
  /* 向右移动元素以腾出空间 */
  for (e = getn(L, tbl_idx) + 1; e > 1; e--) {
    lua_rawgeti(L, tbl_idx, e-1);
    lua_rawseti(L, tbl_idx, e);
  }
  lua_pushvalue(L, val_idx);
  lua_rawseti(L, tbl_idx, 1);
}

void remove_from_head_and_push (lua_State *L, int tbl_idx) {
  int e;
  int n = getn(L, tbl_idx);
  if (n == 0)
    return luaL_error("removed from head of empty list");
  lua_rawgeti(L, tbl_idx, 1);  /* 推送第一个元素 */
  /* 向左移动元素 */
  for (e = 2; e < n; e++)
    lua_rawgeti(L, tbl_idx, e);
    lua_rawseti(L, tbl_idx, e-1);
  }
  lua_pushnil(L, val_idx);
  lua_rawseti(L, tbl_idx, n);
}
2009-06-25 21:22:03