gpt4 book ai didi

c - 使用自定义对函数在 c 中迭代 lua 表

转载 作者:太空狗 更新时间:2023-10-29 17:25:46 25 4
gpt4 key购买 nike

我想使用我在 lua-wiki 站点上找到的 Ordered Table Simple 示例。这是 the link .

在 Lua 中,它可以很好地迭代:

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

我想将 t 传递给 C 方法并在那里迭代表,而不是在 lua 中迭代。在 C API 中,我只找到了原始 pairs 迭代器的 lua_next。如何在 C 中迭代此 lua 代码?

最佳答案

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

int luaL_orderednext(luaState *L)
{
luaL_checkany(L, -1); // previous key
luaL_checktype(L, -2, LUA_TTABLE); // self
luaL_checktype(L, -3, LUA_TFUNCTION); // iterator
lua_pop(L, 1); // pop the key since
// opair doesn't use it

// 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;
}

请注意,我没有对此进行测试,但它应该可以工作。

关于c - 使用自定义对函数在 c 中迭代 lua 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18353084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com