在C语言中从Lua表中快速移除所有项

在C语言中,是否有办法快速从Lua表中移除所有项,而不必手动逐个删除所有项?

我知道,在Lua中可以通过以下命令来实现:

t = {}

但我要特别寻找一种在C语言中从一个存在于堆栈中的表中移除所有项的解决方案。

点赞
用户7396148
用户7396148

通常情况下,为了那些不熟悉的人,改变一种语言的成语是不合适的。

如果你想清除一个类似t={}的表,可以使用lua_replace

清空表和t={}是不一样的。

举个例子:

local tab1 = {1,2,3,4,5}

local tab2 = tab1

function clear(t)
    for k in pairs(t) do
        t[k] = nil
    end
end

clear(tab2)

for k, v in pairs(tab1) do
    print(k, v)
end

这样tab1中没有值。这是因为tab1tab2引用同一个表,所以对tab2所做的更改反映在tab1中。

local tab1 = {1,2,3,4,5}

local tab2 = tab1

tab2 = {}

for k, v in pairs(tab1) do
    print(k, v)
end

这里我们得到:

1 1

2 2

3 3

4 4

5 5

这是因为tab2指向另一个表,没有改变先前所引用的表。

如果您想在c api中执行第一个示例,可以这样做:

/* name: clear
 * function(t) */
static int lcf1_clear (lua_State * L) {
  enum { lc_nformalargs = 1 };
  lua_settop(L,1);

  /* for k in pairs(t) do
   * internal: local f, s, var = explist */
  enum { lc1 = 1 };
  lua_getfield(L,LUA_ENVIRONINDEX,"pairs");
  lua_pushvalue(L,1);
  lua_call(L,1,3);
  while (1) {

    /* internal: local var_1, ..., var_n = f(s, var)
     *           if var_1 == nil then break end
     *           var = var_1 */
    lua_pushvalue(L,-3);
    lua_pushvalue(L,-3);
    lua_pushvalue(L,-3);
    lua_call(L,2,1);
    if (lua_isnil(L,-1)) {
      break;
    }
    lua_pushvalue(L,-1);
    lua_replace(L,-3);

    /* internal: local k with idx 5 */


    /* t[k] = nil */
    lua_pushnil(L);
    lua_pushvalue(L,5);
    lua_insert(L,-2);
    lua_settable(L,1);
    assert(lua_gettop(L) == 5);

    /* internal: stack cleanup on scope exit */
    lua_pop(L,1);
  }
  lua_settop(L,lc1);
  assert(lua_gettop(L) == 1);
  return 0;
}

这是使用lua2c为lua 5.1生成的代码,这是一个需要改进的东西,但是为了得到如何在c api中进行操作的一般想法,它可以是一个有用的工具。

再次强调,不要改变这样的成语。

2020-06-18 17:18:19