Что такое интерфейс C для Lua для доступа к парам ключ / значение таблицы? - PullRequest
3 голосов
/ 08 июня 2009

В Lua, используя интерфейс C для данной таблицы, как перебирать пары ключ / значение таблицы?

Кроме того, если некоторые члены таблицы таблиц добавляются с использованием массивов, нужен ли мне отдельный цикл для итерации по ним, или же существует один способ итерации этих элементов одновременно с парами ключ / значение?

Ответы [ 2 ]

10 голосов
/ 10 июня 2009

Как говорит Хавьер, вам нужна функция 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() для ключа, если он действительно не является строкой, поскольку эта функция заменит значение, которое она преобразует.

6 голосов
/ 09 июня 2009

lua_next() - это то же самое, что функция Lua next(), которая используется функцией pairs(). Итерирует все члены, как в части массива, так и в части хэша.

Если вам нужен аналог ipairs(), lua_objlen() предоставляет вам ту же функциональность, что и #. Используйте его и lua_rawgeti() для числового перебора части массива.

...