lua 给userdata设置元表_提高Lua语言开发效率的简单方法
概述
首先,lua是一门高效的(efficient)、轻量级(lightweight)的嵌入式脚本语言(embeddable scripting language),这是它的官方网站的标语。
其次,lua也是一门面向原型的编程语言(prototype-based language)。这一点其实很好理解,因为lua有元表(metatable)的概念和用法。
截止到目前(2019.01.28),lua官方推出的最新版本如下:
lua
可以看到到,源码+文档说明的压缩档案才不到300KB,代码总数在2w行上下,在Linux上可以编译成182KB左右的可执行文件,说明lua确实很小巧。
语法特性
这篇文章非常详细地总结了lua语言的优缺点,我这边稍微摘抄几个重点介绍下。
1、lua支持多个函数返回值,代码如下:
return
2、lua支持列表项的展开与打包(pack与unpack),代码如下:
print
这在做函数调用和参数传递时,会非常有用。
3、lua的数据类型,有如下几种:
(1)nil 空值
(2)boolean 布尔值,只有 true 和 false
(3)number 数字类型,用c语言的双精度浮点数(double)实现,lua 5.3+版本支持64位长整型。
(4)function 函数类型
(5)table lua表,内部由C语言的无序哈希表和C语言数组实现。
local
(6)Thread lua协程,目前看来,lua并不支持多线程,只是在协同程序上实现了并发。这里有一篇文章详细地介绍了lua协程的用法和特点。
(7)LIGHTUSERDATA 一个 C 指针,由自己管理,lua不会回收。
(8)USERDATA 一块内存区域,由lua管理,自动回收。
(9)upvalue 非临时变量,一般用于lua的闭包
如何提升lua的开发效率
(一)类似面向对象的设计
lua本身不是面向对象编程语言,所以它没有继承、多态这些复杂的语法特性。但是,作为一个面向原型编程语言,lua提供了元表,在一定程度上,提供了类似面向对象的设计思路。
比如,我们可以设计一个ClassBase.lua,定义一个lua“基类”
ClassBase
有了基类的方法,现在可以设计一个好友窗口类,它有自己的方法SortFriend,表示对好友进行排序,同时,它需要使用基类的方法,那么FriendWindow.lua代码如下:
FriendWindow
对于lua表的属性访问,如果该表没有定义__index,则会去该lua表的元表的__index去寻找相应的属性,以此类推。
FriendWindow的元表的__index属性是ClassBase,这样我们可以通过FriendWindow间接使用ClassBase中的属性和方法。
这里很巧妙的,将FriendWindow的元表的__newIndex设置为一个空lua表,就是说,如果要在后续使用FriendWindow的过程中,要想写入一些新的属性和方法,则实际上,是写入到了这个空表中。好处就是,如果想直接清掉这些新属性和新方法的话,可直接修改__newIndex即可。这样的设计,可以极大程度地保留FriendWindow的固有结构,便于清空临时数据,这在游戏逻辑的数据管理中,非常重要。
同时,在FriendWindow的元表中,定义了__call,好处就是:
FriendWindow.key1
(二)数据保护
有时,为了防止其他程序员擅自修改某些lua表中记录的数据,可以将这些数据做“只读化处理”,通过元表可以轻松实现这些特性。
local
定义一个局部函数变量,lua内部会在内存中存储该函数的函数体,同时生成一个局部函数指针,指向函数体。 如果多次定义相同的函数,通过lua调试器可以发现,函数变量的指针地址,每一次都是不相同的。所以这里索性在代码初始的地方,就定义func_readonly这个函数,可以节约函数指针所消耗的内存空间。
通过调用GetReadOnlyValue()方法,获得某一个lua表的只读副本,从而保护lua表中的数据。这在使用配置表数据等应用场景中,非常好用。
lua虚拟机
诸如JVM、Python解释器,这类虚拟机是基于堆栈的虚拟机(stack based vm)。
关于lua虚拟机以及指令相关的内容,这篇文章讲得比较好,我这里做了简单的摘抄。
例如实现两个变量相加 (a = b + c),这类虚拟机通常会将代码编译成如下的指令:
PUSH
而lua虚拟机,是基于寄存器的虚拟机(register based vm)。同样实现两个临时变量相加,虚拟机编译的代码会简单得多:
ADD a b c ; // a = b + c
其中,b、c是被加数和加数(均为操作数),结果存放于a。
Register based vm(基于寄存器的架构) 的指令可以直接对应标准的3地址指令,用一条指令完成了上面多条指令的计算工作,并且有效地减少了内存复制操作。
这样的指令系统对于效率有很大的帮助。
不过,在编译器设计上,就要在代码生成阶段对寄存器进行分配,增加了实现的复杂度。并且每条指令所占用的存储空间也相应的增加了。
对于lua来说,使用局部变量,和全局变量,lua代码编译后的字节码,是完全不一样的。
例如如下的代码,定义了两个临时变量a、b并进行求和操作:
local
经过编译后的字节码如下:
ADD 0 0 1
未完待续。。。。。。
lua 给userdata设置元表_提高Lua语言开发效率的简单方法相关推荐
- lua 给userdata设置元表_lua学习之复习汇总篇
第六日笔记 1. 基础概念 程序块 定义 在 lua 中任何一个源代码文件或在交互模式中输入的一行代码 程序块可以是任意大小的 程序块可以是一连串语句或一条命令 也可由函数定义构成,一般将函数定义写在 ...
- lua 给userdata设置元表_UE4热更新:基于UnLua的Lua编程指南
本片文章搬运自我自己的博客:原文链接: UE4热更新:基于UnLua的Lua编程指南 作者: ZhaLiPeng UE使用的是C++这种编译型语言,在编译之后就成了二进制,只有通过玩家重新安装才能打到 ...
- linux 易语言窗口程序_用易语言开发Linux程序的方法
漫溃廉江欧洲恺撒哈博浑饨?农区南雄青枫沙袋风行画行全盘.赁租落子淋雨长笑林登联氨.欠身双黄妹妹稠密平摊麻乱封杀,蹦极四友萌芽布鞋魔符采制.馆子恭喜乐天内绘磨勘泪液旁出并且! 全盟女神功曹使劲信徒,用易 ...
- css显示内容越来越模糊_55 个提高你 CSS 开发效率的必备片段
这篇文章会记录我们平时常用到的 CSS 片段,使用这些 CSS 可以帮助我们解决许多实际项目问题中遇到的,墙裂建议点赞收藏再看,方便日后查找 附笔记链接,阅读往期更多优质文章可移步查看:前端笔记本 清 ...
- [55 个提高你 CSS 开发效率的必备片段]
[55 个提高你 CSS 开发效率的必备片段] 清除浮动 浮动给我们的代码带来的麻烦,想必不需要多说,我们会用很多方式来避免这种麻烦,其中我觉得最方便也是兼容性最好的一种是,在同级目录下再创建一个&l ...
- 55个提高你CSS开发效率的必备片段
55个提高你CSS开发效率的必备片段 来自:Join GitHub today 链接:https://github.com/Wscats/CV/issues/29 这篇文章会记录我们平时常用到的 CS ...
- 一些提高Android开发效率的工具方法
一些提高开发效率的工具&方法 1. 使用快捷键提高操作效率 下面的有些快捷键是经过我修改的,如果你不知道AS原生的快捷键是什么或者忘记了快捷键可以到Settings->Keymap下面搜 ...
- C#(Net)软件开发常用工具汇总,提高你的开发效率
C#(Net)软件开发常用工具汇总,提高你的开发效率 写代码也要读书,爱全栈,更爱生活.每日更新原创IT编程技术及日常实用技术文章. 我们的目标是:玩得转服务器Web开发,搞得懂移动端,电脑客户端更是 ...
- 有关提高visual studio开发效率的方法
有关提高 visual studio 开发效率的方法见下面的参考文章: http://www.iplaysoft.com/vs2010-features.html http://www.cnblog ...
最新文章
- keystone java,搭建KeystoneJS
- 协议 类似_IPv6基础及地址分类,地址发现协议,一分钟了解下
- Json模块dumps、loads、dump、load函数介绍
- 【数据平台】Pytorch库初识
- CVPR2019| 最新CVPR2019论文:含目标检测、分割、深度学习、GAN等领域
- 消息中间件常见问题汇总
- centos安装python3.7和yum报错解决方法
- Android 控件 -------- AutoCompleteTextView 动态匹配内容,例如 百度搜索提示下拉列表功能...
- html中img显示旋转,css如何实现图片的旋转展示效果(代码示例)
- [System Design] 系统设计 (2) -- 数据库设计
- cygwin安装配置apt-cyg工具
- pmp项目管理的优先级解决方法
- 【工具篇】EasyExcel的应用
- HKC神盾显示器MG27Q - Nano IPS显示器的好选择
- 计算机标准差的按键是什么,在计算器上用标准差键直接求离均差平方和的方法...
- W3C发布HTML5正式推荐标准 开放Web平台迎来新的里程碑
- 用c语言求出1加到100的和
- 两个字与三个字对齐html,css三个字如何和两个字对齐?
- 真正的宇宙中心?未来科技城、云城或将彻底爆发。逃离深圳,拥抱杭州的启示
- 大数据hadoop和spark怎么选择?