转载请标明出处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= {,,}
local B= {,,} st(A, mt)
st(B, mt)
local C = A + B
for k, v in ipairs(C) do
print(v)
end output: , ,

2、mul方法的重写

mt.__mul = function(tA, tB)
local c = {}
for k , v in ipairs(tA) do
table.insert(c, v+)
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"] = ,
["id"] = ,
["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"] =
} 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表占用的内存空间,从而极大的优化你的项目。我就说这么多了,具体的优化还是需要大家自己动手解决。如果你有什么疑问,可以在下面留言一起讨论~

lua中 table 重构index/pairs元方法优化table内存占用的更多相关文章

  1. Lua中的元表(metatable)、元方法(metamethod)详解

    在第一次看见这两样东西的时候,可能会觉得它很深奥,但其实很好理解,虽然实际上它可能真的很深奥.(小若:停!滚粗.) 1.知道为什么1 + 1 = 2吗? 为什么在Lua中,1+1会等于2呢?(小若:难 ...

  2. lua metatable和metamethod元表和元方法

    Lua中提供的元表是用于帮助Lua数据变量完成某些非预定义功能的个性化行为,如两个table的相加.假设a和b都是table,通过元表可以定义如何计算表达式a+b.当Lua试图将两个table相加时, ...

  3. dedecms中去除首页index.html的方法

    本文介绍了dedecms中去除首页index.html的方法,有需要的朋友参考下. dedecms织梦cms建站程序输入地址后,而打开的实际地址后面有个index.html.   这里分享下两种解决方 ...

  4. html table表格导出excel的方法 html5 table导出Excel HTML用JS导出Excel的五种方法 html中table导出Excel 前端开发 将table内容导出到excel HTML table导出到Excel中的解决办法 js实现table导出Excel,保留table样式

    先上代码   <script type="text/javascript" language="javascript">   var idTmr; ...

  5. php中提示Undefined index的解决方法

    我们经常接收表单POST过来的数据时报Undefined index错误,如下: $act=$_POST['action']; 用以上代码总是提示 Notice: Undefined index: a ...

  6. python 实现文本文件中的数字按序排序(位操作,低内存占用)

    文本文件内容   ./txt 3241155299893344 处理代码: import sys a = bytearray(b'') for i in range(100): a.append(or ...

  7. Python中使用自定义类class作为海量数据结构时内存占用巨大的问题

    最近碰到处理一个二十多兆的文件时内存蹭蹭的吃掉四百多兆,吓死宝宝了. 无奈毕竟接触python时间有限,还没有完整的看过python的一些基础知识,我想一个合格的pythoner应该不会碰到这个问题. ...

  8. lua中 table 元表中元方法的重构实现

    转载请标明出处http://www.cnblogs.com/zblade/ lua作为游戏的热更新首选的脚本,其优势不再过多的赘述.今天,我主要写一下如何重写lua中的元方法,通过自己的重写来实现对l ...

  9. lua编程之元表与元方法

    一. 前言 lua是一种非常轻量的动态类型语言,在1993年由由Roberto Ierusalimschy.Waldemar Celes 和 Luiz Henrique de Figueiredo等人 ...

随机推荐

  1. Windows 自动化补丁管理

    Windows 自动化补丁管理 Desktop Central,这一倍受欢迎的补丁管理软件旨在修补可能导致安全薄弱.破坏关键系统数据或导致系统不可用的漏洞.管理此类软件漏洞对网络管理员来说简直是噩梦. ...

  2. Java:ConcurrentHashMap的锁分段技术

    术语定义 术语 英文 解释 哈希算法 hash algorithm 是一种将任意内容的输入转换成相同长度输出的加密方式,其输出被称为哈希值.  哈希表 hash table 根据设定的哈希函数H(ke ...

  3. 使用mobx项目开发总结(不再更新)

      mobx的优点 1,使用@observer的组件真正实现按需更新,只有监听的数据发生变化,它才会re-render,尽管父组件发生更新,但是子组件只要有@observer,则不会触发更新,类似于实 ...

  4. LOJ-10091(强连通分量)

    题目链接:传送门 思路: 多少头牛收到所有牛头牛的喜欢,喜欢具有传递性,所以将互相喜欢的牛视为一个点,就是有向图的 缩点,收到所有牛的喜欢要求这个“点”没有出度,所以缩点之后统计所有没有出度的点就是结 ...

  5. redis_哈希对象

    redis哈希对象的底层编码有两种:ziplist.hashtable ziplist编码 当一个哈希键只包含少量kv对.且key和value都是小整数值.短字符串时,redis会使用压缩列表来做 z ...

  6. python之路(七)-递归算法

    递归 特点 递归算法是一种直接或者间接地调用自身算法的过程.在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解. 递归算法解决问题的特点: (1) 递归就是在 ...

  7. TYVJ1424-占卜DIY

    题目有点长,对于样例最好拿张A4纸模拟写一遍. 可以发现程序一定不会死循环,因为每种牌都是4张,而死循环的条件是某种牌有5张然后你拿了又放进去.如果写出来死循环了,那就是写不对了. 有几点可能是需要注 ...

  8. 软件测试-homework3

    printPrime()代码: public static void printPrimes (int n) { int curPrime; // Value currently considered ...

  9. Akka-CQRS(2)- 安装部署cassandra cluster,ubuntu-16.04.1-LTS and MacOS mojave

    对于akka-cluster这样的分布式软件系统来说,选择配套的数据库类型也是比较讲究的,最好也是分布式的,如cassandra,能保证良好的HA特性.前面的例子里示范akka-persistence ...

  10. Javascript高级编程学习笔记(47)—— 元素遍历

    元素遍历 为了方便我们使用JS来遍历文档中的元素,W3C在原来的基础之上提出了 Element Traversal 规范 这一规范主要就是为了统一浏览器对文档中节点解析不一致的问题. 比如在某些浏览器 ...