一个 nil 值,尝试了一切。

我有一个 nil 变量的问题。由于我是 lua 的初学者,这种情况经常发生。以下是我收到的错误消息:

attempt to index global 'popUp_circle' (a nil value) stack traceback

我正在使用的代码:

function popUp(header, text)
    local popUp_overlay = display.newImageRect("images/transparent_black.png", 480, 320)
        popUp_overlay.x = halfW
        popUp_overlay.y = halfH
        popUp_overlay.alpha = 0.3
        group:insert(popUp_overlay)

    local popUp_background = display.newImageRect("images/popUp.png", 300, 150)
        popUp_background.x = halfW
        popUp_background.y = halfH
        group:insert(popUp_background)

    local popUp_header = display.newText(header,0,0,native.systemFont,14)
        popUp_header.x = halfW+5
        popUp_header.y = halfH-47
        group:insert(popUp_header)

    local popUp_text = display.newText(text,0,0,native.systemFont,14)
        popUp_text.x = halfW
        popUp_text.y = halfH+10
        group:insert(popUp_text)

    local popUp_circle = display.newCircle( halfW+135, halfH-55, 8 )
        popUp_circle:setFillColor( 0 )
        popUp_circle.alpha = 0.3
        group:insert(popUp_circle)
        timer.performWithDelay( 100, timerCircle )
end

function onClickCircle()

end

function timerCircle()
    popUp_circle:addEventListener( "tap", onClickCircle )
end
点赞
用户107090
用户107090

popUp_circlepopUp 中被定义为局部变量,因此在 timerCircle 中不可见。

2014-02-07 15:08:54
用户869951
用户869951

如果要在另一个函数中使用 popUp_circle,那么该函数必须要能够访问它。目前来看这个变量是由你的 popUp 函数定义的。你需要从该函数中返回 popUp_circle,然后把它传递给 timerCircle

function popUp(header, text)
    ...
    return popUp_circle
end

puc = popUp(header, text)
timerCircle(puc)

或者,将其定义为模块级别的局部变量:

local popUp_circle

function popUp(header, text)
    ...
    popUp_circle = display.newCircle(...
    ...
end

这种情况下就没有必要返回它或者将它传递给 timerCircle 了,这样做可能会让你的代码更简洁,但是一旦你的模块变得很大(因为你添加了大量的逻辑代码),很多的模块全局变量会让调试变得更复杂。如果你将模块划分为多个被 main.lua 引用的子模块,那么每个文件都变成了一个对象,并且这些模块全局变量可以被视为该对象的数据成员。

如果你没有在模块级别上将 popUp_circle 声明为局部变量,那么它将成为一个真正的全局变量,"污染"了全局命名空间,这是应该避免的。

2014-02-07 16:14:00