Lua - попытка вызова global (нулевое значение) - PullRequest
2 голосов
/ 17 апреля 2011

При выполнении этого кода я получаю сообщение об ошибке «попытка вызвать глобальный« forId »(значение nil)»

function execute(args)
    local itemid = 526
    local bone = forId(itemid) -- this is where the error occurs
end

function forId(bid) 
    local xp = 0.0
    if bid == 526 or bid == 528 or bid == 2530 or bid == 2859 then
        xp = 4.5
    elseif bid == 3179 or bid == 3180 or bid == 3183 or bid == 3185 then
        xp = 5.0
    elseif bid == 530 then
        xp = 53
    elseif bid == 532 or bid == 3125 then
        xp = 15
    elseif bid == 4812 then
        xp = 22.5
    elseif bid == 7839 then
        xp = 30
    elseif bid == 6812 then
        xp = 50
    elseif bid == 536 then
        xp = 72
    end
    local bone = Bone:new(bid, xp)
    return bone
end

Bone = class(function(b, id, xp)
    b.id = id
    b.xp = xp
end)

Может кто-нибудь сказать мне, почему?

Ответы [ 3 ]

6 голосов
/ 17 апреля 2011

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

Bone = class(function(b, id, xp)
    b.id = id
    b.xp = xp
end)

function forId(bid) 
    local xp = 0.0
    if bid == 526 or bid == 528 or bid == 2530 or bid == 2859 then
        xp = 4.5
    elseif bid == 3179 or bid == 3180 or bid == 3183 or bid == 3185 then
        xp = 5.0
    elseif bid == 530 then
        xp = 53
    elseif bid == 532 or bid == 3125 then
        xp = 15
    elseif bid == 4812 then
        xp = 22.5
    elseif bid == 7839 then
        xp = 30
    elseif bid == 6812 then
        xp = 50
    elseif bid == 536 then
        xp = 72
    end
    local bone = Bone:new(bid, xp)
    return bone
end

function execute(args)
    local itemid = 526
    local bone = forId(itemid) -- this is where the error occurs
end

Но так как вы не предоставили полный код, это может привести к смещению ошибки в другом месте.

1 голос
/ 17 апреля 2011

попробуйте сначала кэшировать его как локальный, особенно если вы используете module:

local forId = forId //or _G.forId
local bone = forId(itemid)
0 голосов
/ 18 января 2016

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

dofile(core.app_path() .. "\\strategies\\standard\\include\\helper.lua");

(точную команду можно найти в документальных фильмах вашего программного обеспечения.)

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