添加内容时表为空

时间:2013-07-28 19:52:33

标签: lua lua-table crysis

当我向表格(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服务器mod的一部分(参见下面的整个功能),但手头有整个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'变量:

enter image description here

2 个答案:

答案 0 :(得分:4)

在代码末尾附近有#Umbra.Banlist == 0,但我没有看到数字键插入任何项目。以下是一些需要检查的事项,看看你的假设是否符合现实。

检查profile是否不是nil。看起来在你的用例中你假设它是一个数字。您可以通过以下方式轻松查看:

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

如果profile实际上不是数字类型,那么使用#运算符检查Umbra.Banlist是错误的。注意#不计算表的关联部分。如果您只关心Umbra.Banlist是否为空,您可以使用if next(Umbra.Banlist) then来检查它。

答案 1 :(得分: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”替换“pair”时相同。所以当你做#Umbra.Banlist,其中所有索引都是字符串时,它返回0,因为有0个整数索引,但这并不意味着该表是空的。