首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >lua_pop vs lua_remove

lua_pop vs lua_remove
EN

Stack Overflow用户
提问于 2010-01-21 00:23:45
回答 3查看 7.6K关注 0票数 5

目前,我正在用C++构建我自己的脚本VM管理器类。我对Lua & Lua或C++没有任何问题,但让我困惑的是什么时候使用lua_pop,什么时候使用lua_remove

据我所知,lua_pop是从上到下删除多个值(在堆栈上),消除不再需要的数据,而as lua_remove用于从任意有效的堆栈索引中删除单个值(基本上就像Lua手册中所说的那样:P)。

但是我注意到web上散布着一些混合了lua_poplua_remove的代码片段,但是当我尝试使用lua_pop而不是lua_remove时,我遇到了问题。那么,有没有可能得到一个明确的例子或解释,说明如何以及何时正确使用这两个函数,以及这两个函数的相对速度和效率?我假设lua_poplua_remove更快,这也是我想要尽可能多地使用lua_pop的原因之一,除了编写“正确的代码”。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-01-21 00:49:44

lua_remove的一个典型示例是访问表。来自Lua reference manual的代码片段。

代码语言:javascript
复制
lua_getfield(L, LUA_GLOBALSINDEX, "t");   /* table to be indexed */
lua_getfield(L, -1, "x");        /* push result of t.x (2nd arg) */
lua_remove(L, -2);                  /* remove 't' from the stack */

lua_getfield将tx推送到堆栈上。您不再需要t,因此您将其删除。

lua_pop的一个典型例子是对表进行迭代。

代码语言:javascript
复制
lua_pushnil(L);  /* first key */
while (lua_next(L, t) != 0) {
    /* uses 'key' (at index -2) and 'value' (at index -1) */
    /* do whatever you like with the key and the value */

    lua_pop(L, 1);
}

在完成一次迭代之后,您需要将键放在堆栈的顶部,以便lua_next知道接下来是哪个键/值对。您需要删除位于堆栈顶部的值。

这不是一个明确的例子。在Lua中,你可以做任何对你有用的事情。请始终牢记lua_State堆栈上的内容,这样就不会有问题了。

票数 8
EN

Stack Overflow用户

发布于 2010-01-29 05:57:48

它们是非常不同的。lua_pop总是从堆栈的顶部删除。lua_remove将从堆栈上的任何对象中删除一个值。如果您希望从堆栈中删除的值不在顶部,则不能使用lua_pop

例如:

代码语言:javascript
复制
[5][4][3][2][1]
after lua_pop(L, 3); would be
[X][X][X][2][1]



[5][4][3][2][1]
after lua_remove(L, 3); would be
[X][5][4][2][1]
票数 2
EN

Stack Overflow用户

发布于 2012-02-13 08:21:23

以下几段C代码是完全等效的:

代码语言:javascript
复制
lua_pop(L, 1); // same as:
lua_remove(L, -1);

这些也是:

代码语言:javascript
复制
lua_pop(L, n); // same as:
lua_settop(L, lua_gettop(L)-n);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2102942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档