Таблица пуста при добавлении контента
У меня огромная проблема, когда я добавил контент в таблицу (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
Я получаю это:
Я посмотрел в Интернете и на этом сайте, но, похоже, нет никаких связанных вопросов, поэтому я публикую его здесь.
Этот код является частью серверного мода для 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
проверить это.