Lua table.getn () возвращает 0? - PullRequest
       38

Lua table.getn () возвращает 0?

9 голосов
/ 08 марта 2012

Я встроил Lua в свое C-приложение и пытаюсь выяснить, почему в моем C-коде создана таблица с помощью:

lua_createtable(L, 0, numObjects);

и возвращается в Lua, выдаст нулевой результат, когда я вызову следующее:

print("Num entries", table.getn(data))

(где "data" - таблица, созданная с помощью lua_createtable выше)

В таблице явно есть данные , так как я могу просмотреть каждую пару записей (строка: userdata) через:

for key, val in pairs(data) do
  ...
end

Но почему table.getn (data) возвращает ноль? Нужно ли что-то вставлять в мета таблицы при создании с помощью lua_createtable? Я смотрел на примеры использования lua_createtable и нигде не видел, чтобы это делалось ....

Ответы [ 4 ]

25 голосов
/ 08 марта 2012

table.getn (который не следует использовать в Lua 5.1+. Используйте оператор длины #) возвращает количество элементов в массиве массив таблицы.

Часть массива - это каждый ключ, который начинается с цифры 1 и увеличивается до первого значения nil (отсутствует).Если все ваши ключи являются строками, то размер части массива вашей таблицы равен 0.

3 голосов
/ 17 января 2013

Хотя это дорого (O (n) против O (1) для простых списков), вы также можете добавить метод подсчета элементов вашей карты:

>> function table.map_length(t)
    local c = 0
    for k,v in pairs(t) do
         c = c+1
    end
    return c
end

>> a = {spam="data1",egg='data2'}
>> table.map_length(a)
2

Если у вас есть такие требованияи если ваша среда позволяет вам сделать это, подумайте об использовании подсветки , которая обеспечивает такого рода функций и многих других.

2 голосов
/ 08 марта 2012

оператор # (и table.getn) эффективно возвращает размер секции массива (хотя, когда у вас есть дырявая таблица, семантика более сложна)

Он ничего не считает в хэштаблица (например, строковые ключи)

0 голосов
/ 14 октября 2014
for k,v in pairs(tbl) do count = count + 1 end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...