![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Lua
文章平均质量分 92
包括Lua基础,Lua FAQ收集,tolua、xlua框架等
莫之
不努力奔跑,怎么能停在原地
展开
-
Lua字节码分析
二.lua字节码分析Linux luac命令使用详解原创 2021-03-23 19:56:53 · 4381 阅读 · 0 评论 -
Lua中模拟函数重载机制
C++中函数重载机制函数定义时的处理:编译器的函数符号命名机制,C++对代码进行编译时会根据函数名、参数列表(参数类型、数量、顺序)等对函数进行重新命名;函数调用时的处理:(我曾经错误理解为调用时的处理和处理函数定义时类似,通过判断参数类型来得到函数名进行调用,但是这种粗暴的方式会有很多逻辑漏洞,比如未考虑到有默认参数的函数调用,未考虑到编译器自动类型转换的函数调用等)在函数调用时,编译器如何判断调用的是哪个函数呢,大概过程如下:首先确定所考虑的重载函数集合,该函数集合被称为候选函数,一原创 2020-12-08 00:14:05 · 2157 阅读 · 0 评论 -
Lua可变长参数的问题方案汇总
lua中的可变长参数...不是第一类值,因此在实际应用中会遇到一些问题一、可变长参数的存储问题我们都知道,使用如下写法会导致运行报错,因为...不是一个变量,它是匿名的,不可以在不同的作用域内使用,因为编译器将无法识别...到底是哪一个作用域的;function tuple(...) return function() return ... endend如下是一个例子,我们使用trace对一个传入的函数进行包装,添加了它的执行日志,然后将其执行结果返回,这原创 2020-12-02 23:16:39 · 1255 阅读 · 0 评论 -
在table中存储nil值
在table中,nil不可以作为key,否则会有运行报错;而且,有时候使用#获取长度时,会因为nil而导致无法获取到正确的长度;如下,有一个函数,它是用来把参数进行反序,使用#获取长度,但是长度出现了问题;function reverse(...) local t = {...} for i = 1,#t/2 do local j = #t - i + 1 t[i],t[j] = t[j],t[i] -- swap end return tab原创 2020-12-01 01:59:27 · 669 阅读 · 0 评论 -
Lua 弱表
一、弱表与垃圾回收lua的垃圾回收是通过检查一个对象是否被引用来判断对象是否应当被回收的;而弱引用则是一种机制:高速lua一个引用是一个弱引用,它需要被垃圾收集器忽视,如果一个对象的所有引用都是弱引用,lua就可以回收这个对象;table中有key和value,这两者都可以包含任意类型的对象,通常,垃圾收集器不会回收一个可访问table中作为key和value的对象,这些key和value都是强引用,它们会阻止对其所引用对象的回收。在一个弱引用table中,key和value是可以被回收的,有三种弱原创 2020-11-08 17:49:58 · 924 阅读 · 0 评论 -
Lua协程 基础和使用汇总
一、协程基础简单介绍lua协程和线程类似,拥有独立堆栈,独立局部变量;主要区别在于lua可以同时运行多个线程,但是在同一时刻只能有一个协程在运行,并且这个正在运行的协程只有在明确要求挂起的时候才会被挂起,比如调用yield,或者启动别的协程;coroutine.create(func)创建一个线程,返回一个线程实例coroutine.wrap(func)创建一个协程,但是返回的是一个函数;coroutine.resume(co,...)启动一个线程,并将参数传给调用的函数原创 2020-10-29 21:41:34 · 1668 阅读 · 0 评论 -
Unity 将组件的数据序列化成lua文件以及反序列化
功能说明:使用最大化骨骼的时候需要添加动骨,但是对于不同的时装每个动骨组件要有不同的数据,因此希望将所有动骨的数据序列化存储到lua文件夹中,可读性好,使用xlua也易于解析,之后如果想要在原有参数上做调整,只需要将数据文件再导入或者直接修改lua文件中的某个参数即可;InspectorUI扩展:首先是写了一个InspectorUI的扩展,一个存储按钮和一个解析按钮; public override void OnInspectorGUI() { DrawBu原创 2020-08-25 21:35:17 · 905 阅读 · 0 评论 -
使用批处理为git hook建立软链接
一、问题来源与解决方案在另一篇文章中使用Luacheck和git hook在git pre-commit时检查lua代码规范介绍了使用git hook在提交时做一些hook,比如unity meta文件上传检测,这个很多美术同学都容易漏掉;以及引入luacheck时需要一些环境变量和luacheck的配置等;但是有几个麻烦的点:首先是配置较多比较繁琐,尤其是对非程序的同学不够友好 再者,hook文件不能加入到版本控制中,包括luacheck的配置也不能在版控中,但是我们确实需要将其进行版本控制原创 2020-08-05 13:55:36 · 612 阅读 · 0 评论 -
Windows下luarocks和luafilesystem的安装
一、luarocks和luafilesystem介绍luarocks是lua的一个安装第三方包的工具,如同python的pip一样luafilesystem简称lfs,是一个文件系统包,一些包的安装如luacheck会要求先安装lfs,在安装lfs的时候踩了一些坑,因此这篇文章在于避开坑,快速安装 luarocks和lfs;二、luarocks安装,官网下载相应的安装包,里面有luarocks.exe,下载以后解压,然后配置相应的环境变量,在命令行中输入luarock...原创 2020-08-04 13:04:27 · 2071 阅读 · 0 评论 -
使用Luacheck和git hook在git pre-commit时检查lua代码规范
https://www.jianshu.com/p/d66c2f2e3537https://zh.wikipedia.org/wiki/MinGWhttps://sourceforge.net/projects/mingw-w64/files/mingw-w64/https://blog.csdn.net/gneveek/article/details/104014569http://lua-users.org/wiki/LuaRocksConfighttps://github.c.原创 2020-08-04 12:37:24 · 1031 阅读 · 0 评论 -
Lua dump的简单实现
借鉴《Lua Gems》,整理的一份lua dump的代码,用于解析任意一个数据类型的具体信息;function vardump(value, depth, key) local linePrefix = "" local spaces = "" if key ~= nil then linePrefix = "[" .. key .. "] = " end if depth == nil then depth = 0 e原创 2020-05-29 16:07:31 · 1812 阅读 · 0 评论 -
Lua中的性能优化
table了解table的组成,分为两部分数组和哈希,当lua需要向表中插入一个哈希值而hash数组又满了的时候,lua将会重新计算哈希,而新的hash计算的第一步就是要确定新的table和hash部分的size大小,这就是重新分配表中数组和哈希表部分的流程;lua会分别计算两个部分的size,然后选择一个size(size为2的n次方)使其满足curCount<=size<=2*curCount,参考如下程序,在一开始创建一个新表的时候,数组和hash的size都是0,在第一次循环,数组s原创 2020-05-28 21:23:51 · 964 阅读 · 0 评论 -
Lua进阶随笔
Lua性能优化 table的频繁查找,尽可能使用local变量,不要在循环中做大量表的查找,例如不要在循环中用全局函数,不要使用math.floor这种,而是将它的值提前存储在局部变量,因为即使是hash表的查找也会比较耗时; 频繁的创建新的对象,不要在循环中频繁创建新表,如a = {}这种操作等,要有缓存池的概念; 配置表的格式优化,配置表通常在游戏中占比很大,所以配表的优化也很重要; Lua Gems中给出的一个性能优化的文档,十分不错:https://www.lua.or原创 2020-05-28 12:09:06 · 427 阅读 · 0 评论 -
基于Lua实现的红点系统
一、介绍红点系统是游戏和各种软件中常用的系统,本文的目的是使用lua实现一个基于树结构的简单红点系统;项目地址:https://github.com/zhimo1997/LuaRedPoint代码如下local RedPointManager = {}local RedPointCPTb = { RP_UI2_Btn1 = 'RP_UI1_Btn0',}function RedPointManager:Init() self:InitRedPropertyTb()end原创 2020-05-19 17:41:28 · 1724 阅读 · 0 评论 -
Lua table拷贝函数实现
一、Lua table拷贝功能分析在lua的table中,并没有像其它语言那样为类提供拷贝函数,所以需要开发者额外实现;没有统一的实现的主要原因,在于table的复杂性,table可以包含各种类型的值,以及包含元表等,统一的实现并不能满足我们实际遇到的各种需求;二、几种常见需求的实现1.数组table的拷贝数组table的拷贝比较简单,但是要求要拷贝的table中不能包含散列表...原创 2020-03-07 02:07:12 · 6558 阅读 · 0 评论 -
Lua中仿函数(functor)的实现
一、什么是仿函数我们知道,一个函数通常包含函数主体、函数参数、返回值三个重要结构;对于一个函数来说,它的数据无非就是两种,函数主体内声明的局部变量,以及参数传入;如果一个函数想要拥有自己的数据怎么办?最先想到的,设计一个类,然后填充数据,然后调用这个函数;C++中提供了函数运算符重载,允许我们定义一个函数对象类,实例化时填充数据并可以像调用一个函数一样调用一个实例;二、在lua中实现一个仿...原创 2020-03-07 01:11:14 · 481 阅读 · 0 评论 -
Lua float和int类型总结
一、float和int类型的区分从lua5.3以后,lua中的number类型有了两个子类型,float和int,但是他们的类型都是number;Lua对两种类型有显式使用的规则,但是lua也会提供自动转换,因此,大多数时候我们并不需要关注float和int之间的区别;标准的Lua是使用64-bit的int以及64-bit的双精度float,但是也支持使用32-float的int以及32-...原创 2020-03-02 10:31:15 · 13529 阅读 · 0 评论 -
Lua中栈的实现
一、栈实现的基本要点1.数据结构-栈栈结构为先进后出类型,FILO,类似于弹夹;它的特点在于只允许在栈顶进行插入和删除操作,另一端为栈底;一个栈主要有以下几个要素入栈:将数据放入到栈中 出栈:将数据从栈中取出 栈顶位置:表示当前栈中实际元素的数量,以及入栈和出栈的索引位置 空栈和满栈:栈的两种状态2.Lua中的实现思路Lua中只有一个数据结构,就是table,所以我们肯...原创 2020-02-25 18:13:10 · 1812 阅读 · 0 评论 -
正则表达式总结
一、正则表达式1.普通字符表示所有大写和小写字母、所有数字、所有标点符号和一些其它符号;2.非打印字符\n,匹配一个换行符 \r,匹配一个回车符 \s,匹配任何空白字符 \S,匹配任何非空白字符3.特殊字符特殊字符,即具有特殊含义的字符,而非字符表面意义;特殊字符的应用在正则表达式中尤为关键;$,匹配输入字符串的结束位置; ^,匹配输入字符串的开始位置; (),...原创 2020-03-01 00:01:18 · 1615 阅读 · 0 评论 -
Lua中的错误处理与调试类
一、错误处理pcall:返回两个参数值,第一个标记为true/false,第二个为错误信息;原创 2020-02-23 16:24:55 · 1000 阅读 · 0 评论 -
Lua中字符串长度
一、Lua中如何获取一个字符串的长度一般来说有两种方式,一种使用"#"来计算,另一种来使用字符串函数string.length来计算;local str1="中国人"local str2="zhongguoren"print(#str1) --9print(string.len(str1)) --9print(#str2) --11print(string.len(str2)...原创 2020-02-18 19:54:11 · 7810 阅读 · 0 评论 -
设计模式之观察者模式
一、观察者模式介绍二、模式引用之Lua中的事件分发LuaEvent.lua:封装了一个具体的事件相关的内容,一个LuaEvent是一个发布者,它包含了一系列订阅者,以及发布-订阅等方法;local LuaEvent={}function LuaEvent:New(eventId) local tb={} tb.eventId=eventId tb.obse...原创 2020-02-16 14:50:11 · 176 阅读 · 0 评论 -
递归函数与尾递归总结
递归,是一个熟悉而陌生的概念,说它熟悉,是因为人们经常提起它,而说它陌生,指的是人们在实际编程中几乎不会主动使用它。给定一个问题,如果本质上它能看做一个调用自身的规模较小的一个子问题来求解;在设计一个递归函数解决一个问题时,通常要注意两个要素,递推关系以及终止条件;而且在思考递推关系时,因为函数是递归调用的,所以尤其要注意逻辑顺序;对于数学问题的计算一般比价简单,对于更为广泛的实际问...原创 2020-02-14 11:40:06 · 366 阅读 · 0 评论 -
Lua 元表基础与应用
一、元表概述通常,Lua中的每个值都有一套预定义操作集合,比如数字可以相加,字符串可以连接,表中可以插入键值对等;但是我们无法对两个table相加,无法对函数进行比较等;元表的出现可以解决以上问题:我们可以通过元表来修改一个值的行为,使其在面对一个非预定义的操作时执行一个指定的操作;Lua中每个值都有一个元表,table和userdata可以有各自独立的元表,其它类型的值则共享其类型所...原创 2020-02-17 02:18:51 · 679 阅读 · 0 评论 -
Unity编辑器扩展之创建Lua模板文件
本文主要提供了创建.lua模板以及xlua中的.lua.txt格式的模板文件;主要参考自:简书-Unity技术 扩展脚本模板(Lua为例) erick_book原博主的文章中只支持了创建lua文件的模板,由于最近需要使用功能到xlua,而xlua的后缀为.lua.txt,所以就加了个扩展;正所谓不要重复造轮子嘛,自己简单看了一下代码就搬了过来,做了点简单修改,在这里分享一下;主要包...原创 2020-01-17 18:26:45 · 887 阅读 · 0 评论 -
Unity3d:LuaPanda+xlua调试
一、LuaPanda介绍LuaPanda是腾讯开源的一款用于vscode的Lua代码工具,类似于vscode中的luaide,不过luaide是收费的,而luapanda是开源的,而且luapanda还补充了一些luaide没有支持到的功能;LuaPanda中已经给出了比较详细的教程,这里主要是总结归纳一下自己在第一次配置时遇到的一些问题,希望对大家能够有所帮助;这里先贴出lua官方的...原创 2020-01-17 12:35:24 · 8400 阅读 · 0 评论 -
Lua面向对象与简单框架思路
一、认识lua中的面向对象编程lua中的table就是一种对象,它和其它语言中的对象一样拥有一个独立于其值的标识(self);使用self参数是所有面向对象语言的一个核心,大多数面向对象语言都能对程序员隐藏部分self参数,从而使得程序员不必显式声明这个参数,Lua中使用冒号,则能隐藏self参数,冒号只是一种语法便利,并没有引入新的东西;在一个函数中,我们往往不希望使用到全局变量而希望使...原创 2020-01-15 20:07:28 · 459 阅读 · 0 评论 -
Lua函数中的可变长参数的处理
一、Lua函数中的可变长参数Lua允许接收一系列的可变长参数,如同C#的params;但是,我们如何去获取这些可变长参数呢;arg,当函数被调用时,所有的参数都会被收集到一个名为arg的序列表中,我们可以使用arg[1]等来获取参数;一个比较特殊的字段是n,arg.n被用来获取表的长度,也就是参数的数量;但是在lua5.1以后,不再使用这种处理方式,它不会再为每一个可变长参数生成一个t...原创 2020-01-13 13:05:46 · 3570 阅读 · 0 评论 -
Lua中的非空判断
非空判断大家在使用 Lua 的时候,一定会遇到不少和 nil 有关的坑吧。有时候不小心引用了一个没有赋值的变量,这时它的值默认为 nil。如果对一个 nil 进行索引的话,会导致异常。如下:local person = {name = "Bob", sex = "M"}-- do somethingperson = nil-- do somethingprint(pers...转载 2020-01-13 11:31:52 · 24881 阅读 · 0 评论 -
Lua模块与包
一、模块与包的概念模块系统的一个主要目标是允许以不同的形式来共享代码,但是如果没有一项公共的规则就无法实现共享;两个重要的函数module:用于创建模块,使用table来实现模块的优点在于:可以向操作普通的table那样来操作模块; require:用于加载模块,使用require加载后得到一个table,这个table就像是一个命名空间,table中的内容就是模块所导出的所有东西...原创 2020-01-13 11:27:55 · 518 阅读 · 0 评论 -
UnityEngine.Object和System.Object的区别与问题归纳
一、UnityEngine.Object和System.ObjectC#中有一句经典,所有的对象都是从Object派生而来的,UnityEngine.Object也是从System.Object派生而来;但是两者也有很大的差异,首先是在创建的时候UnityEngine.Object obj=new UnityEngine.Object();if(obj==null){ } //不...原创 2020-01-13 10:59:18 · 2767 阅读 · 0 评论 -
Lua迭代器的实现
一、迭代器和闭包的关系Lua控制结构中的for循环主要有两种,数值for和泛型for,泛型for的使用要依赖于迭代器,就像之前遍历表时经常使用的pairs和ipairs;所以我们实现迭代器,就是为了泛型for,而lua迭代器的实现又要多依赖于该语言对闭包的支持;Lua迭代器:我们需要通过迭代器来遍历集合的每一个元素,而我们实现的方式就是要实现一个函数,使得我们每次调用该函数它就自动返回集合...原创 2020-03-13 02:44:56 · 1017 阅读 · 1 评论 -
Lua 闭包
一、闭包的定义及基本概念在计算机科学中中,闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。闭包在运行时可以有多个实例,不同的引用环境和相同的函数组...原创 2019-08-12 12:36:49 · 419 阅读 · 0 评论 -
第一类值
一、概念描述第一类公民、第一类对象(不特指面向对象里的”对象”)、第一类实体、第一类值(这些概念都是一个,只是叫法不同)是支持其他实体所有操作的实体。这里有两个地方要展开:实体与其他实体 :通常实体是指各种各样的数据类型和值,比如对象、类、函数、字面量等,一般讨论都是指函数是不是第一类对象(first-class object)。操作(这些实体所具有的操作有):可以作为变量或者数据...原创 2019-08-12 10:30:23 · 877 阅读 · 0 评论 -
Lua 函数与闭包
一、基本语法一个lua程序既可以通过Lua语言编写的函数,也可以调用C语言编写的函数。Lua语言标准库中的所有函数都是使用C语言编写的。调用函数时使用的参数个数可以与定义函数时使用的参数个数不一致,Lua通过抛弃多余参数和将不足的参数设为nil的方式来调整参数的个数。当函数只有一个参数,且参数为字符串或表时,()是可选的;print("hello world") <==>...原创 2019-08-11 14:38:57 · 576 阅读 · 0 评论 -
Lua 表-table
一、简单认识table作用:table是lua的一种变量类型,而在lua中没有提供数据结构,所以table将会用于帮助我们创建不同的数据结构,如数组、字典等;使用语法:table是一个关联性数组,可以用任意类型的值来做数组的索引,除了nil(lua语法支持nil,但不提倡使用);而且所有的索引值都需要用[],如果是字符串,可以去掉引号和中括号;如果没有中括号,则认为是字符串索引;表是l...原创 2019-08-11 14:39:07 · 820 阅读 · 0 评论 -
Lua中的输入输出与文件操作
前言:lua语言追求的是可移植性和嵌入性,它本身并没有提供太多与外部交互的机制。在真实的lua程序中,大多数IO操作要么由宿主程序实现,要么通过外部库实现,单就lua语言而言,它只提供了基本的文件操作等简单功能,在文件操作上,它提供了两种模型。一、简单I/O模型I/O中提供了一个简单模型,当前输入流和当前输出流,其I/O操作就是通过流来实现的。I/O库把当前输入流初始化为进程的标准输入...原创 2019-03-18 15:23:57 · 4389 阅读 · 0 评论 -
Lua 入门(数据类型与表达式)
前言:本文介绍的主要内容就是lua的基本数据类型一、Lua语言独立解释器Lua是用C语言写的,只需要从官网下载解释器源码,然后自己运行便可以得到解释器。Lua是动态弱类型语言;Lua的执行有两种方式,一种是保存在文件中然后使用lua命令去执行脚本文件,另一种则是在交互模式下运行独立解释器。第一种,使用lua命令执行脚本,lua命令的完整参数形式如下,lua [option...原创 2019-03-16 10:04:40 · 1682 阅读 · 0 评论 -
Lua goto特性以及各种方便用途
一、认识gotogoto是lua5.2以后加入的新特性,和其它语言中的goto用法相似;goto说明符会将一段程序转换到一个label,一个label定义之后在整个代码块都是课件的,除了嵌套函数之外;用法如下:我们可以使用::gotoname_::来声明一个跳转的标志符,之后可以使用goto直接转到该行代码继续执行;在lua中,一直会被抱怨没有continue关键字,使用goto就...原创 2020-01-11 15:10:11 · 6975 阅读 · 0 评论 -
Lua中为什么没有continue关键字
众所周知,Lua中一直没有continue关键字,为开发者带来了一些不便,本文简单阐释一下缘由并给出替代方案;、1.为什么没有continue关键字首先看看在Lua-FAQ中的解释:This is a common complaint. The Lua authors felt thatcontinuewas only one of a number of possible new c...原创 2020-01-11 15:10:50 · 2625 阅读 · 0 评论