【问题标题】:lua:attempt to index field '?' (a nil value)lua:尝试索引字段“?” (零值)
【发布时间】:2020-11-21 03:46:49
【问题描述】:

现在我在以下代码中遇到了不断出现此错误的障碍

box.lua:31: 尝试索引字段 '?' (零值)

我试图纠正这个错误,但失败了。

下面是完整的代码

    function ChatSystem(event, player, msg, Type, lang)
        local Guid = player:GetGUIDLow()
        if flag[Guid] ~= 0 then
            local daan = quiz["box"][flag[Guid]][2];
            local t = msg;
            if (t+1 == daan+1) then
                player:SendBroadcastMessage("[Notice]correct")
                SetPlayerFlag(player, 0)
                SetPlayererror(player, 0)
            else
                cuowu[Guid] = error[Guid] + 1;
                if cuowu[Guid] >= quiz["frequency"] then
                    SetPlayererror(player, 0)
                    Kick( player )
                else
                    player:SendBroadcastMessage("[Notice]  error"..cuowu[Guid].."   "..quiz["box"][flag[Guid]][1].."");
                end
            end
        end
    end
    
    
    function Start (event, player, item, count)
        local datigailv = math.random(1, 100)
        if (datigailv <= quiz["Chance"])then
            local select = math.random(1, 5)
            local Guid = player:GetGUIDLow()
            SetPlayerFlag(player, select)
            SetPlayererror(player, 0)
            player:SendBroadcastMessage("[Notice]answer my question:"..quiz["box"][flag[Guid]][1].."");
        end
    end
    
    RegisterPlayerEvent(32, Start) 
    RegisterPlayerEvent(18, ChatSystem);

【问题讨论】:

  • 这个错误之后你有什么事情吗?
  • quiz["box"]quiz["box"][flag[Guid]] 均为零
  • 顺便说一下,GUID 的低部分不是 GUID。您甚至可能有两个具有相同低位的球员。
  • 逻辑错误:if flag[Guid] ~= 0 then。如果flag[Guid]nil,那么它总是正确的,将其更改为:if (flag[Guid] or 0) ~= 0
  • 另一个逻辑错误:if (t+1 == daan+1) then。如果t 值是非数字字符串或空字符串,则会抛出错误。改为:if tonumber(t) == daan then

标签: lua


【解决方案1】:

由于数组中的数组错误很难跟踪,如果可能,请尽量避免它或添加一些断言,如assert(quiz["box"][flag[Guid]]) 以检查您是否有这样的数组值。

在 lua 中,您可以使用 flag[Guid] = nil 而不是 flag[Guid] = 0 删除值。

我的版本没有数组和动态问题生成:

local quiz = {
  chance = 2,
  frequency = 3
}

local quiz_flags = {}

function ChatSystem(event, player, msg, Type, lang)
  local quiz_info = quiz_flags[player:GetGUIDLow()]
  if quiz_info then
    if tonumber(msg) == quiz_info.answer then
      player:SendBroadcastMessage('[Notice] correct')
      quiz_flags[player:GetGUIDLow()] = nil -- remove flag info
    elseif quiz_info.count >= quiz.frequency then
      quiz_flags[player:GetGUIDLow()] = nil -- remove flag info
      Kick(player)
    else
      player:SendBroadcastMessage('[Notice] error '..quiz_info.count..',   '..quiz_info.question..'=?')
      quiz_info.count = quiz_info.count + 1
    end
  end
end
    
function Start(event, player, item, count)
  if math.random(1, 100) <= quiz.chance then
    -- generate math expression
    local q = math.random(1,3)..(math.random(1,2) == 1 and '+' or '*')..math.random(1,3) 
    quiz_flags[player:GetGUIDLow()] = {
      count = 1,
      question = q,
      answer = load('return '..q)() -- calculate answer
    }
    player:SendBroadcastMessage('[Notice] answer my question: '..q)
  end
end
    
RegisterPlayerEvent(32, Start)
RegisterPlayerEvent(18, ChatSystem)

【讨论】:

  • 非常感谢您的提示对我帮助很大,我解决了这个错误
猜你喜欢
  • 2011-11-05
  • 2014-04-04
  • 2021-05-15
  • 2016-09-19
  • 1970-01-01
  • 2012-10-23
  • 2012-03-12
  • 2020-05-28
相关资源
最近更新 更多