Каков интерфейс C для Lua для доступа к парам ключ/значение таблицы?
-
12-09-2019 - |
Вопрос
В Lua с помощью С интерфейс, учитывая таблицу, как мне перебирать пары ключ/значение таблицы?
Кроме того, если некоторые элементы таблицы добавляются с использованием массивов, нужен ли мне отдельный цикл для их перебора или существует единственный способ перебора этих элементов одновременно с парами ключ/значение?
Решение
lua_next()
это то же самое, что и Lua next()
функция, которая используется pairs()
функция.Он перебирает все элементы, как в части массива, так и в части хеша.
Если вам нужен аналог ipairs()
, lua_objlen()
дает вам ту же функциональность, что и #
.Используйте его и lua_rawgeti()
для численного перебора части массива.
Другие советы
Как говорит Хавьер, вы хотите 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()
на ключе, если только он на самом деле не является строкой, потому что эта функция будет заменять значение, которое он преобразует.