Lua5.1 用 metatable のマジックメソッド __next を実装する
Lua5.1には、metatableで利用できる、__next が無いらしいので独自に拡張する。
以下を参考
GeneralizedPairsAndIpairs
-- next関数の拡張 rawnext = next function next(t,k) local m = getmetatable(t) local n = m and m.__next or rawnext return n(t,k) end -- nextの拡張だけで以下のようにできる local priv = {a = 1, b = 2, c = 3} local mt = { __next = function(t, k) -- -- ここに適当な処理を追加できる -- return next(priv, k) end } local t = setmetatable({}, mt) for k,v in next, t do print(k,v) end
すばらしい。
cocos2d-x Lua メモリ改竄のチート対策でデータをジャミングしたい時などに、このmetatable使って処理するとやりやすいかも。
-- -- -- function encodeXXX() return -- デコード処理 end -- -- -- function decodeXXX() return -- デコード処理 end -- -- -- function createEncTable() local t1 = {} local t2 = setmetatable({},{ __index = function(t, key) return decodeXXX(t1[key]) end, __newindex = function(t, key, val) t1[key] = encodeXXX(val) end, __next = function(t, k) local t2 = {} for k,v in pairs(t1) do t2[k] = decodeXXX(v) end return next(t2,k) end }) return t2 end
基本的な対策としてはジャミングが目的なので
エンコード部分は適当なXORとかの簡易なものでもいいと思う。