lua进阶
讲解项目中遇到的lua中高级特性,玩转lua
Shonm
用blog记录点点滴滴。。。成长的轨迹一步一个印
展开
-
lua面向对象生成实例的正确方式
写lua这么久了,也知道怎么样用lua来实现所谓的面向对象。下面这段代码是我常用来new一个新实例对象的:local Object = {a = 123}function Object:new (data) local data = data or {} setmetatable(data, {__index = self}) return data ...原创 2019-03-06 22:39:21 · 1112 阅读 · 0 评论 -
lua代码优化
前几天写代码lua时,由于涉及到大量的数值逻辑计算,所以性能至关重要。经过一番研究和调试,总结了如下提高lua代码执行效率的方法:使用缓存这个不论是在lua,在任何语言的程序中都适用,脚本语言显得尤为突出。使用缓存来优化,提高程序性能是一个很大的主题,这里不再详细论述。只需记得,当使用重复数据(或有重叠)时一定要缓存起来,以供后面使用,而不是每次都重新计算,这样会大大提高效率,尤其是涉及到繁...原创 2019-03-06 15:23:50 · 2428 阅读 · 2 评论 -
lua 迭代器的实现
lua迭代器的用法为:for k, v in (i)pairs(t) do print(k,v)end我们搞懂for...in做了什么的就明白上面代码的实现了。其实for..in后面需要一个迭代函数,该函数可以有两个参数,一个是状态常量,一个是控制变量。例如:local ipairsIter = function(t, i) i = i + 1 local ...原创 2018-07-20 12:34:36 · 419 阅读 · 0 评论 -
lua 热更新原理(二)
在讲lua热更新原理第二部分之前,先介绍一下lua调试相关的函数。调试函数能够帮助我们在开发中获取函数堆栈相关上下文信息,甚至改变函数的变量。getinfo ([thread,] f [, what]):返回关于一个函数信息的表。 你可以直接提供该函数, 也可以用一个数字 f 表示该函数。 数字 f 表示运行在指定线程的调用栈对应层次上的函数: 0 层表示当前函数(getinfo 自身); 1 层...原创 2018-06-11 18:28:27 · 3553 阅读 · 0 评论 -
Lua的面向对象设计1
这几天看了Lua程序设计,读懂面向对象设计后,发现真的好巧妙.Lua本身没有支持面向对象的特性,如像C++,java有class等关键字,Lua的面向对象完全是基于其自身的特性来模拟设计的,读懂之后不得不叹服.Lua的面向对象特性是基于其表和元表的特性来完成的,下面举例说明比如,我们要设计一个账户类,包含存钱(deposit())取钱(withdraw())的方法,还有余额(balance)成员变...原创 2017-04-14 11:56:40 · 641 阅读 · 2 评论 -
lua 和C交互相关函数
1 堆栈相关1.1int (lua_gettop) (lua_State *L); 【-0,+0】用于返回栈中元素的个数,同时也是栈顶元素的索引,因为栈底是1,所以栈中有多少个元素,栈顶索引就是多少;2.2void (lua_settop) (lua_State *L, int idx); 【-?,+?】把栈索引idx设置为栈...原创 2018-03-22 11:19:14 · 552 阅读 · 0 评论 -
lua 加载文件相关函数
重点掌握 require,dofile,loadfile,其他的了解即可。一、require 1.功能:载入文件并执行代码块,对于相同的文件只执行一次,即多次require时,只会执行一次文件的代码块 2.调用:require("filename").注意这里文件名不能包括后缀名,否则会提示找不到文件. 注:寻找文件的路径在package.path中,print(package.pat...原创 2018-03-22 15:23:50 · 1722 阅读 · 0 评论 -
lua 协程代码执行流程
lua协程是比较高级的内容,代码执行流程比较复杂难懂,在这里分析一下.有如下代码co1 = coroutine.create( function ( ) print('at co1 a ') coroutine.resume(co2) print('at co1 b ') end)co2 = coroutine.create( function ( ) prin...原创 2018-03-24 17:55:47 · 1622 阅读 · 1 评论 -
lua协程场景分析
上一篇文章lua代码执行流程介绍了lua协程代码执行的流程,感觉这种写法不直观,难懂,我们知道存在即合理,那lua协程的合理又在哪里呢?实际又用在哪里呢,给开发带来哪些好处呢?这篇按照我的理解分析一下,不足之处请指正.有这样一个场景,服务器产生一些字符,然后客户端显示这些字符,即典型的生产者--消费者模式.直白的写法如下:function producer() return io....原创 2018-03-26 11:03:57 · 5399 阅读 · 1 评论 -
lua5.3中luaL_setfunc设置upvalue的用法示例
缘起luaL_setfuncs 这个函数可以注册c函数到lua,另外还可以设置闭包函数使用的变量upvalue. 我没有用过,在 云风的skynet 才第一次见过,于是写个例子实际使用以下.函数原型:void luaL_setfuncs (lua_State L, const luaL_Reg l, int nup);文档定义:Registers all functions in the arra...转载 2018-03-27 09:34:05 · 1265 阅读 · 0 评论 -
lua 与c交互api
/*相关API:====lua_createtable 原型: void lua_createtable (lua_State *L, int narr, int nrec); 描述: 创建一个新的table并将之放在栈顶.narr是该table数组部分的长度,nrec是该table hash部分的长度. 当我们确切的知道要放多少元素到table的时候,使用这个函数,lua可以预分配一些...转载 2018-03-27 10:13:39 · 455 阅读 · 0 评论 -
lua协程相关参数与返回值
通过上两篇lua代码执行流程, lua协程场景分析的介绍,知道了协程的基本用法和场景.其实协程与协程之间是通过参数和返回值进行交互的.引用上篇的代码:coConsume = coroutine.create( function () while true do local stutas, msg = coroutine.resume(coProducer) print('rece...原创 2018-03-28 10:44:51 · 1208 阅读 · 0 评论 -
Lua的内存监测和回收
Lua内存是自动收集的, 这点跟Java类似, 不被任何对象或全局变量引用的数据,将被首先标记为回收,不需要开发者做任何事情.但是,正如Java也会有内存泄露一样, Lua也会有, 只不过,跟C++的不同,它是由于代码执行所装载的资源,并没有被彻底销毁而导致,其中,最臭名昭著的就是不小心把局部变量声明成了全局变量(忘了加local修饰符)。 类似这样造成的内存泄露, 跟任何其他语言的内存泄露一样,...转载 2018-03-28 15:21:01 · 428 阅读 · 0 评论 -
lua协程池
看云风老大的skynet源码,里面有创建协程池的写法.云大真是把lua技术玩的炉火纯青啊,不得不让人佩服.看到协程池这个名字就知道他是用来干嘛的,相信大家也见过线程池,内存池的概率和写法.因为创建这些资源是很费时间和内存的,所以预先创建一些这样的资源,或者重复利用已有的资源就可以达到提高程序运行的效率.下面就来分析一下lua协程池.local coroutine_pool = {}local ...原创 2018-03-28 15:52:16 · 2130 阅读 · 5 评论 -
lua的元表
接触lua一年多,是要把lua的高级特性总结一下了.先说说元表吧.元表是什么?为什么要有元表?学过C++的童鞋应该知道操作符重载.例如,自定义一个复数类,可以让他的两个实例相加减等等.同理,lua的元表也可以让两个表相加减,但是他使用了更简单的语法.lua的元表是为了扩展lua的特性,使他的功能更加丰富.要想使一个表拥有加法操作的功能,必须给他添加一种元表__add,语法如下:...原创 2018-04-17 21:23:38 · 563 阅读 · 0 评论 -
lua 元表的补充说明
1 __index前面讲过lua元表的作用(详见lua元表),尤其对__index有重点讲解。在研究skynet源码时发现了__index新的用法,记录一下。我们已经知道__index的作用是表查找不到字段时的索引,索引我们见到的__index都是另一个表,实际上__index也可以是一个函数。函数在字段查找不到时触发。例如下面的代码:local function fun(t,...原创 2018-06-04 20:56:22 · 546 阅读 · 0 评论 -
lua require机制
相信大家在lua中都用过require。为了达到代码复用和结构化的目的,各种语言都有require机制。lua的require看似简单,其实里面有很多玄机。一 require从哪里加载模块文件从虚拟机的path,cpath等全局变量中。虚拟机有默认的值,在变量package.path和package.cpath中。例如我打印的path,cpath分别为:path :/usr/loc...原创 2018-06-07 15:32:47 · 20830 阅读 · 1 评论 -
lua 热更新原理(一)
热更一般是针对模块的线上替换。我们动态加载要热更的模块试试。例如,我们在循环间隔加载某模块,这样就能有时间去更改模块了。测试的代码如下:for i = 1, 5 do local m = require('other') print('other.a is ', m.a) Sleep(5)end我们循环加载了other这个模块他仅仅返回一个local table...原创 2018-06-07 20:59:22 · 30364 阅读 · 5 评论