USE " cc.exports.* = value " INSTEAD OF SET GLOBAL VARIABLE"

Cocos2d-x 3.5的lua項目生成後,變成了MVC模式,而且,加入了一個全局變量的檢測功能。也就是說,你不當心用了全局變量,他會提示你出錯!socket

好比函數

local temp = 1ui

temp = 10lua

print(temp)spa

你寫成了orm

local temp = 1開發

tepm = 10 –這裏寫錯了string

print(temp)it

而後,print結果就會不一樣,同時你還會建立一個 全局的 tepm 永遠不會被釋放。這種問題,在lua中很容易遇到(雖然如今有代碼提示 仍是不太容易出現,可是誰說的準呢!)。io

因此,C2d加入了一個全局命名空間的檢測,經過setmetatable的方式。該函數在

src/cocos/framework/init.lua

-- disable create unexpected global variable
function cc.disable_global()
    setmetatable(__g, {
        __newindex = function(_, name, value)
            error(string.format("USE \" cc.exports.%s = value \" INSTEAD OF SET GLOBAL VARIABLE", name), 0)
        end
    })
end

if CC_DISABLE_GLOBAL then
    cc.disable_global()
end<span style="font-family:Arial;font-size:18px;color:#333333;"><span style="line-height: 26px;">
</span></span>

有效的幫助開發者避免上述錯誤!

那麼若是我必定要用到全局變量才行呢?例如 require "socket" 的luasocket庫

這個問題有若干種解決辦法,

一、最簡單粗暴的就是直接註釋掉着一塊。

二、將CC_DISABLE_GLOBAL設置爲False

三、在mian.lua的 require "cocos.init"以前 require 所需的庫和全局的變量

可是 若是是開發者本身須要使用全局變量。而不是其餘庫須要用到全局變量的話!

請使用使用官方推薦的方法cc.exports.* 來充當全局變量!

如:cc.exports.MY_GLOBAL = "hello"

相關文章
相關標籤/搜索