使用自定义pair函数在C语言中遍历Lua表。

我想使用我在 lua-wiki 网站上找到的 Ordered Table Simple 示例。这是 链接。在 Lua 中,使用以下代码可以循环:

for i,v in t:opairs() do
   print( i,v )
end

相反我想将 t 传递到一个 C 函数中,在那里迭代表格。在 C API 中,我只找到了 lua_next 用于原始的 pairs 迭代器。如何在C中迭代这个Lua代码呢?

点赞
用户234175
用户234175

你可以编写一个自定义的 next C 函数,该函数模仿 lua_next,但是可以在这个有序表上运行,而不是使用 opairs 方法。

int luaL_orderednext(luaState *L)
{
  luaL_checkany(L, -1);                 // 上一个键
  luaL_checktype(L, -2, LUA_TTABLE);    // 自身
  luaL_checktype(L, -3, LUA_TFUNCTION); // 迭代器
  lua_pop(L, 1);                        // 弹出键,因为
                                        // opair 没有使用它

  // iter(self)
  lua_pushvalue(L, -2);
  lua_pushvalue(L, -2);
  lua_call(L, 1, 2);

  if(lua_isnil(L, -2))
  {
    lua_pop(L, 2);
    return 0;
  }
  return 2;
}

然后,您可以在 C 中类似于 lua_next 使用它:

int orderedtraverse(luaState *L)
{
  lua_settop(L, 1);
  luaL_checktype(L, 1, LUA_TTABLE);

  // t:opairs()
  lua_getfield(L, 1, "opairs");
  lua_pushvalue(L, -2);
  lua_call(L, 1, 2);

  // iter, self (t), nil
  for(lua_pushnil(L); luaL_orderednext(L); lua_pop(L, 1))
  {
    printf("%s - %s\n",
           lua_typename(L, lua_type(L, -2)),
           lua_typename(L, lua_type(L, -1)));
  }
  return 0;
}

注意,我没有测试这个代码,但它应该可以工作。

2013-08-21 20:23:05