в настоящее время я создаю свой собственный сценарий класс менеджера по 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
как можно больше, кроме кодирования 'правильного кода')
спасибо :)
Типичным примером 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, и все будет хорошо.
Они очень разные. 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]