search
LoginSignup
2

More than 5 years have passed since last update.

posted at

updated at

グローバル変数を捕まえよう

LuaそしてCoronaでグローバル変数は色々な問題の原因となります。
そしてLuaの構成上でも、実はパフォーマンスにも良くはありません(とは言え普通のアプリで変数をグローバルにしたことでパフォーマンス悪影響は大したことない)。

他にグローバル変数の悪影響はこのCoronaブログの記事にも書いてあります:
 http://coronalabs.com/blog/2013/05/28/tutorial-goodbye-globals/

では今回の本題、グローバル変数を捕まる手法、に入りましょう。
自分はグローバル変数を極力使わない派ので、自分はいつもmain.luaの先頭にこのpatchを当てます。これをすれば誰かどこかでグローバル変数を使ったのはすぐ捕まえる!

patch.lua
local _KNOWN_GLOBALS = {
    _scrollview = true,
    imageSheet  = true,
    LuaLibStore = true,
    facebook    = true,
    socket      = true,
    store       = true,
    launchPad   = true,
    crypto      = true,
    lfs         = true,
    --など...
    --外部モジュールはたまにGlobalに変数を定義するので、一旦無視をしたい変数をこちらに追加
}
setmetatable(_G, {
    __index = function( t, k )
        if _KNOWN_GLOBALS[k] then
            return
        end    
        print("ERROR", debug.traceback("access of undefined global "..tostring(k), 2))
        _KNOWN_GLOBALS[k] = true
    end,
    __newindex = function( t, k, v )
        rawset(t, k, v)
        if _KNOWN_GLOBALS[k] then
            return
        end
        print("WARN", debug.traceback("creating new global "..tostring(k).."="..tostring(v), 2))
    end
})

自分はこのちょっとしたコードのおかげで何回か救われたことあるので是非使ってみてください!

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
2