luaのメタテーブルを用いてtable変数の変化を追跡する

880 ワード

プロジェクト開発中にバグが発生し、グローバルtableの変数と関係がありますが、この変数は複数のファイルで変更されています.コード追跡を見て、この変数が具体的にその場所で変更されたのを見て、めまいがして、問題も見つかりませんでした.后で何か简単な方法がないと思って、luaの元表を思い出して、_indexと_newindex、これを利用して、debug.tarcebackを組み合わせて使用します.
具体例:例えばdataテーブルのhp変数を追跡する必要がある
local data = {}

local mt = {
    __index = function ( table, key )
        return rawget(table, key)
    end,
    __newindex = function ( table, key, value )
        if key == "hp" then 
            print("this is DataGlobal __newindex key is", key, value)
            print(debug.traceback())
        end
        rawset(table, key, value)
    end
}

setmetable(data, mt)
ここで注意すべきはrawgetとrawsetを使用し、メタテーブルの呼び出しを迂回し、table[key]=valueを直接使用するとデッドループに入ることです.
実はこのモードでは、tableのfunctionの呼び出し回数を記録したり、tableの変数を暗号化したりすることもできます.自分のニーズに合わせて活用できる.
参照先:http://blog.csdn.net/wangbin_jxust/article/details/12108189