есть ли исправление для значения Nil для локального пользователя - PullRequest
0 голосов
/ 30 сентября 2019

Это для телефонного скрипта, над которым я работал, и я пытаюсь обновить какой-то код, но я получаю единственную ошибку.

Error @phone/server.lua:37: attempt to index a nil value (local 'user')
 ref (@phone/server.lua:37)
 handler (@framework/server/main.lua:242)
 getNumberPhone (@phone/server.lua:36)
 handler (@phone/server.lua:268)

Я попробовал один способ, который мне показывали здесь раньше, но не повезло.

строка 37

function getNumberPhone(source, n)
    local n = 0 
    TriggerEvent('f:getPlayer', source, function(user)
        n = user.getPhoneNumber()
    end)
    return n
end

строка 242

AddEventHandler("f:getPlayer", function(user, cb)
    if not cb then return end
    if(Users)then
        if(Users[user])then
            cb(Users[user])
        else
            cb(nil)
        end
    else
        cb(nil)
    end
end)

строка 36

function getNumberPhone(source, n)
    local n = 0 
    TriggerEvent('f:getPlayer', source, function(user)
        n = user.getPhoneNumber()
    end)
    return n
end

строка 286

RegisterServerEvent('gcPhone:allUpdate')
AddEventHandler('gcPhone:allUpdate', function()
    local source = source
    local identifier = GetPlayerIdentifiers(source)[1]
    TriggerClientEvent("gcPhone:myPhoneNumber", source, getNumberPhone(source))
    TriggerClientEvent("gcPhone:allMessage", source, getMessages(identifier,source))
    TriggerClientEvent("gcPhone:contactList", source, getContacts(identifier))  
end)

1 Ответ

2 голосов
/ 02 октября 2019

Объяснение ошибки

В Lua это одна из самых распространенных ошибок, с которой вы столкнетесь, поэтому очень важно знать, как ее решить.

Ошибка: attempt to index a nil value

Чтобы понять, что означает эта ошибка, вам нужно понять только эти понятия.

  • В Lua можно индексировать только таблицы (то есть myTable[myIndex])
  • В Lua, если переменная оценивается как nil, то попытка проиндексировать ее, как если бы она была таблицей, приводит к ошибке

Так что, должно быть немного легче понять ошибкуты принят. Более явным способом описания этой ошибки было бы что-то вроде «интерпретатор Lua попытался проиндексировать вашу переменную user в строке 37, но user оценивается как nil

ваш конкретный случай

В строке 242 вы вызываете обратный вызов и передаете nil

cb(nil)

Этот обратный вызов отправляет это значение nil в строку 37 в качестве параметра user

TriggerEvent('f:getPlayer', source, function(user)
    n = user.getPhoneNumber()
end)

Таким образом, когда вы пытаетесь запустить user.getPhoneNumber(), вы на самом деле запускаете nil.getPhoneNumber(), что выдает ошибку, которую вы видели.

Способы устранения этого типа ошибки

1) Всякий раз, когда вы работаетес переменной, которая может быть nil, создайте оператор if, проверяющий, является ли он nil перед продолжением.

2) Убедитесь, что вы никогда не устанавливали эту переменную на nil.

Способы исправления вашей конкретной ошибки

1) В строке 36 создайте оператор if

TriggerEvent('f:getPlayer', source, function(user)
    if user ~= nil then
        n = user.getPhoneNumber()
    end
end)

Или выполните аналогичную проверку nil, как это

TriggerEvent('f:getPlayer', source, function(user)
    if user then
        n = user.getPhoneNumber()
    end
end)

2) Всегда передавайте пользователя в вашем обратном вызове. Например, в строке 242 и в других местах передайте фактический объект пользователя.

cb(Users[someUser])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...