轉載請標明出處http://www.cnblogs.com/zblade/
lua作為游戲的熱更新首選的腳本,其優勢不再過多的贅述。今天,我主要寫一下如何重寫lua中的元方法,通過自己的重寫來實現對lua中的常用方法特定編寫,從而實現對table的重構。
table中關鍵的一點是使用setmetatable和getmetatable,分別是對table進行元表設置和讀取。
一、lua中table的元方法
table中的元方法主要分為算術類和關系類的元方法,算數類元方法可以分為:加(_add)、減(_sub)、乘(_mul)、除(_div)、求模(_mod)、求冪(_pow)。這兒我就舉例復寫兩種代表的方法加和乘,其他幾種方法都可以類似的復寫。
1、add方法的復寫
st = setmetatable gt = getmetatable mt = {} --復寫mt的加方法 mt.__add = function(tA, tB)
local c = {} for k, v in ipairs(tA) do table.insert(c, v+1)
end return c end
local A= {1,2,3} local B= {4,5,6} st(A, mt) st(B, mt) local C = A + B for k, v in ipairs(C) do print(v) end output: 2 ,3 ,4
2、mul方法的重寫
mt.__mul = function(tA, tB) local c = {} for k , v in ipairs(tA) do table.insert(c, v+2) end return c end
local A = {1, 2, 3}
local B = {4, 5, 6}
st(A,mt)
st(B,mt)
local C = A*B
for k , v in ipairs(C) do
print(v)
end
output: 3, 4, 5
分析可以知道,其實只需要我們對於元表的元方法進行重寫,然后進行一個setmetatable的操作,就可以讓我們的指定的table的對應的元方法變成我們重寫的方法了。其他的幾種方法和關系類的相關方法都可以用類似的方法實現。
二、對於table中的pair/index的元方法的重寫
上面說到的基本方法在應用中比較少見,在table中應用最多的是pairs/ipairs/index兩種方法,如果我們合理的重寫這幾種方法,可以極大的提高元表的效率。在這兒我列舉一種優化方案:在很多時候我們需要對游戲中的table中的元素進行遍歷,如果我們能夠將游戲中的配置表進行優化,采用默認的table來取代最高頻率出現的表,則我們可以極大的優化配置表的大小。talk is cheap, show the code, 下面用代碼實現這種優化策略:
local st, gt = setmetatable, getmetatable local mt = {} local default = { ["name"] = "zblade", ["telphone"] = 123456, ["id"] = 7, ["school"] = "uestc" } --復寫index mt.__index = function(tbl, key) local val = rawget(tbl, key) if val then return val else return default[key] end end local func = function (tbl, key) local nk, nv = next(default, key) if nk then nv = tbl[nk] end return nk, nv end --復寫 pairs mt.__pairs = function (tbl, key) return func, tbl, nil end local test = { ["id"] = 8 } st(test, mt) --測試pairs的復寫 for k, v in pairs(test) do print(v) end -- output: 8 , uestc, zblade, 123456 --測試 index的復寫 print(test.id) print(test.name) print(test.school) print(test.telphone) -- output: 8 , uestc, zblade, 123456
如果你能看懂上面的代碼,那么你一定知道如何優化你項目中的lua表了,通過巧妙的重寫index和pairs方法,你可以大大的節省你lua表占用的內存空間,從而極大的優化你的項目。我就說這么多了,具體的優化還是需要大家自己動手解決。如果你有什么疑問,可以在下面留言一起討論~