В Lua, используя интерфейс C, учитывая таблицу, как мне выполнить итерацию по парам ключ/значение таблицы?
Кроме того, если некоторые элементы таблицы таблицы добавляются с использованием массивов, нужен ли мне отдельный цикл для их повторения или существует единственный способ итерации по этим элементам одновременно с парами ключ/значение?
Ответ 1 · рейтинг 6 · Javier
lua_next() - это то же самое, что и функция Lua next(), которая используется функцией pairs(). Он перебирает все элементы, как в части массива, так и в части хэша.
Если вам нужен аналог ipairs(), lua_objlen() дает вам ту же функциональность, что и #. Используйте его и lua_rawgeti() для численного перебора части массива.
Ответ 2 · рейтинг 11 · RBerteig
Как говорит Хавьер, вам нужна функция lua_next(). Я подумал, что пример кода может помочь прояснить ситуацию, поскольку на первый взгляд это может быть немного сложно.
Цитата из мануала:
Типичный обход выглядит так:
/* table is in the stack at index 't' */
lua_pushnil(L); /* first key */
while (lua_next(L, t) != 0) {
/* uses 'key' (at index -2) and 'value' (at index -1) */
printf("%s - %s\n",
lua_typename(L, lua_type(L, -2)),
lua_typename(L, lua_type(L, -1)));
/* removes 'value'; keeps 'key' for next iteration */
lua_pop(L, 1);
}
Имейте в виду, что lua_next() очень чувствителен к значению ключа, оставшемуся в стеке. Не вызывайте lua_tolstring() для ключа, если только он уже не является строкой, потому что эта функция заменит преобразованное значение.