lua_pop по сравнению с lua_remove

в настоящее время я создаю свой собственный сценарий класс менеджера по VM в C++, у меня нет проблем ни с одним из lua и lua C или материала C++, но один раздел, который смущает меня: когда использовать lua_pop и когда использовать lua_remove.

Из того, что я понимаю, lua_pop должен удалить несколько значений (на стеке) от вершины вниз, устранив данные, которые больше не необходимы, где как lua_remove для удаления единственного значения от любого произвольного индекса допустимого стека (в основном, что lua руководство говорит для обоих :P).

но я заметил определенные сегменты кода, рассеянного вокруг сети, которые смешиваются lua_pop и lua_remove, но когда я пытался использовать lua_pop вместо lua_remove куда вызов просто удалил главный элемент стека, я столкнулся с проблемами, так будет он быть возможным надеть категорический пример или explaination, как и когда использовать эти две функции правильно, а также reletive скорость и efficency для этих двух (я принимаю lua_pop быстрее, чем lua_remove, который является одной из причин, почему я хочу использовать lua_pop как можно больше, кроме кодирования 'правильного кода')

спасибо :)

5
задан Necrolis 21 January 2010 в 06:17
поделиться

2 ответа

Типичным примером lua_remove является обращение к таблицам. Отрывки из справочного руководства Lua.

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 выталкивает t[x] на стек. Вам больше не нужно t, поэтому вы удаляете его.

Типичным примером lua_pop является итерация по таблице.

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
ответ дан 13 December 2019 в 05:35
поделиться

Они очень разные. lua_pop всегда удаляет сверху стека. lua_remove будет удалять значение из любого места стека. Если значение, которое вы хотите удалить со стека, не находится сверху стека, вы не можете использовать lua_pop.

например

[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
ответ дан 13 December 2019 в 05:35
поделиться