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とかの簡易なものでもいいと思う。