Таблица пуста при добавлении контента

У меня огромная проблема, когда я добавил контент в таблицу (Lua), где все содержимое в таблице внезапно исчезает. В рассматриваемой таблице хранятся данные для банлистов (в настоящее время 608 записей), и они помещаются в таблицу с помощью table.insert, однако ведущая запись для пользователя выполняется как Umbra.Banlist[profileId] = {};, Список Umbra.Banlist[profileId] = {}; одна таблица должна означать, что в таблице Umbra.Banlist есть контент. Я не получаю ошибок при запуске кода и при использовании

    if (#Umbra.Banlist == 0) then
        System.LogAlways(Umbra.Tag.." The Banlist seems to be empty. It seems that some part of loading has failed.");
    end

Я получаю это:

1

Я посмотрел в Интернете и на этом сайте, но, похоже, нет никаких связанных вопросов, поэтому я публикую его здесь.

Этот код является частью серверного мода для Crysis Wars (см. Всю функцию ниже), но имеет под рукой всю библиотеку Lua (поэтому не беспокойтесь, если не считаете, что ваш ответ не решит проблему).

Код:

    Umbra.ReadBans = function()
    self = Umbra;
    System.LogAlways(Umbra.Tag.." Starting banlist read.");
    FileHnd, err = io.open(Root().."Mods/Infinity/System/Read/Banlst.lua", "r");
    if (not FileHnd) then
        System.LogAlways(Umbra.Tag.." Unable to find file 'Banlst.lua'.");
        return;
    end
    for line in FileHnd:lines() do
        local name, profile, ip, domain, reason, date, bannedby = line:match([[Umbra.BanSystem:Add%('(.-)', '(.+)', '(.+)', '(.+)', '(.+)', '(.+)', '(.-)'%);]]);
        if (not name) then
            System.LogAlways(Umbra.Tag.." Failed to read the banlist at line "..count or 0);
            break;
        end
        System.LogAlways(Umbra.Tag.." Banlist; Name: [ "..name.." ], For: [ "..reason.." ], By: [ "..bannedby.." ]");
        --local Msg, Date, Reason, Type, Domain = line:match([[User:Read%( "(.-)", { Date="(.+)"; Reason="(.+)"; Typ="(.+)"; Info="(.+)"; } %);]]);
        --User:Read( "Banned", { Date="31.03.2011"; Reason="WEBSTREAM"; Typ="Inetnum"; Info="COMPUTER.SED.gg"; } );
        --Umbra.BanSystem:Add('patryk', '258132298', '178.183.243.163', '178.183.243.163.dsl.dynamic.t-mobile.pl', 'flyhack', '08/11/2012 | 21:39:53', 'Anti-Noob');
        Umbra.Banlist[profile] = {};
        table.insert(Umbra.Banlist[profile], name);
        table.insert(Umbra.Banlist[profile], ip);
        table.insert(Umbra.Banlist[profile], domain);
        table.insert(Umbra.Banlist[profile], reason);
        table.insert(Umbra.Banlist[profile], date);
        table.insert(Umbra.Banlist[profile], bannedby);
        --[[Umbra.Banlist[profile].name = name;
        Umbra.Banlist[profile].ip = ip;
        Umbra.Banlist[profile].domain = domain;
        Umbra.Banlist[profile].reason = reason;
        Umbra.Banlist[profile].date = date;
        Umbra.Banlist[profile].bannedby = bannedby;--]]
        if not count then count = 0; end
        count = count + 1;
    end
    Umbra.Bans = {};
    Umbra.Bans.cnt = count;
    System.LogAlways(Umbra.Tag.." Read "..count.." banned players (added into the Umbra Global Banlist)");
    if (#Umbra.Banlist == 0) then
        System.LogAlways(Umbra.Tag.." The Banlist seems to be empty. It seems that some part of loading has failed.");
    end
    count = nil; --Purge this one as well, again!
end

Редактировать:

Я не получаю сообщение о том, что код ниже должен напечатать, если их профиль не существует в таблице, поэтому их профиль действительно существует.

    if (not Umbra.Banlist[profile]) then
            System.LogAlways(Umbra.Tag.." Error in 'Umbra.Banlist': The profile does not exist.)");
            break;
        end

Другое Править:

Доказательство того, что система может фактически получить переменную 'ID':

2 ответа

Решение

Просто попробуйте использовать эту функцию, чтобы получить количество элементов в таблице:

function count(t)
    local c=0;
    for i in pairs(t) do c=c+1; end
    return c;
end
--...
if(count(Umbra.Banlist)==0)then
    --...
end

Дело в том, что # считает массив / таблицу с числовыми индексами, но у вас есть таблица со строковыми индексами. # такой же, как если бы вы заменили "пары" на "ipairs" в этой функции подсчета. Итак, когда вы делаете #Umbra.Banlist, где все индексы являются строками, он возвращает 0, потому что есть 0 целочисленных индексов, но это не значит, что таблица пуста.

Ближе к концу вашего кода у вас есть #Umbra.Banlist == 0 но я не вижу никаких вставок в него с помощью цифровых клавиш. Вот несколько вещей, чтобы проверить, соответствуют ли ваши предположения реальности.

Проверь это profile не nil, Похоже, в вашем случае вы предполагаете, что это число. Вы можете легко проверить это с помощью:

assert(profile)
assert(type(profile) == 'number')

Если profile на самом деле не тип числа, то проверка Umbra.Banlist с # оператор неисправен. Заметка # не считает ассоциативную часть таблицы. Если вам важно, пуст ли Umbra.Banlist или нет, вы можете использовать if next(Umbra.Banlist) then проверить это.

Другие вопросы по тегам