【问题标题】:A nil value, tried everything一个零值,尝试了一切
【发布时间】:2014-02-07 15:05:51
【问题描述】:

我对 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

【问题讨论】:

    标签: lua coronasdk


    【解决方案1】:

    popUp_circlepopUp 中定义为本地,因此在timerCircle 中看不到。

    【讨论】:

    • 哦,所以如果我在函数内部创建一个局部变量,我以后不能在函数之外使用它吗?我非常感谢你帮助我解决了这个问题。它对我帮助很大,我只是一个新手。 :)
    • @Bartando,是的,这就是 local 的意思。
    • 我如何调用 global 变量?
    • @Bartando 你没有。所有变量都是全局变量(如果您熟悉 Lua 环境,真的是环境),除非在当前作用域或该作用域的外部作用域中定义为 local 等等。你有两个选择: 1. 删除local,所以popUp_circle 将是全局的; 2. 将local popUp_circle 放在你的模块顶部,所以popUp_circle 将是模块/文件范围的本地而不污染全局命名空间。
    • @Bartando 啊,Schoii 已经解释过了。抱歉打扰了。
    【解决方案2】:

    如果您要在另一个函数中使用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 local,它将是一个真正的全局,“污染”全局命名空间,绝对要避免。

    【讨论】:

    • 也谢谢你,这对我帮助很大。你让我明白了:)
    猜你喜欢
    • 2019-09-19
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 2017-10-21
    • 1970-01-01
    • 2013-12-07
    • 2017-03-30
    相关资源
    最近更新 更多