Lua使用笔记
记录一些在开发过程中使用Lua的一些经验和技巧!
fightsyj
任时光流转,仍初心不忘!
展开
-
Lua实战之以非科学记数法输出小数
Description现有小数 n,我们知道,当 n < 0.0001 时会以科学计数法输出,例如:local n = 0.0000999print(n) -- 9.99e-005由于不少人对科学计数法并不熟悉,所以还是希望以非科学计数法输出,如何实现?Implementionfunction printDecimal(n) if type(n) ~= "number" then return tostring(n) end if n原创 2021-09-14 21:15:07 · 1269 阅读 · 0 评论 -
Lua string.format() 使用整理
在使用 Lua 进行实际开发的过程中,格式化字符串的函数 string.format() 的使用频率是非常高的,这里整理一下关于这个函数的使用。string.format(formatstring, ···)formatstring 为格式化串(必须是一个字符串),其中可能包含多个转义码(例如最为常用的 %d %s 等)。... 为数量不定的参数列表,以逗号分隔,与格式化串中的转义码一一对应。e.g.print(string.format("%s Have %d Olympic Gold Med原创 2021-09-11 21:42:09 · 7354 阅读 · 2 评论 -
Lua 使用 os.time 获取时间戳需谨慎
1、使用 os.time() 获取当前系统时间戳可以放心大胆的使用,不会出问题!print("curTimeStamp->", os.time())2、使用 os.time({timeTbl}) 获取指定日期的时间戳就需要注意了:指定日期必须是在 1970-01-01 08:00:00 之后才能获取到时间戳,否则返回 nil 。print(os.time({year = 1970, month = 1, day = 1, hour = 8, min = 0, sec = 0}))原创 2021-06-23 16:47:15 · 8597 阅读 · 0 评论 -
Lua实战之布尔值(boolean)排序
Description将 targetTbl 按 bValue 进行排序(true > false),bValue 相同则按 id 进行顺序(有小到大)排序!local targetTbl = { {id = 1, bValue = false}, {id = 2, bValue = true}, {id = 3, bValue = true}, {id = 4, bValue = false}, {id = 5, bValue = true}}Implemention原创 2021-06-21 21:45:43 · 1291 阅读 · 0 评论 -
Lua实战之密码验证
验证标准:密码必须包含数字、字母(不区分大小写)和特殊字符,长度为8-16位!function checkPwd(pwd) if #pwd == 0 then print("密码不能为空") return false end if #pwd < 8 or #pwd > 16 then print("密码长度为8-16位") return false end local numberCnt, letterCnt, specialCnt, otherCnt = .原创 2021-03-02 20:33:43 · 2787 阅读 · 2 评论 -
Lua 字符与ASCII码互转
字符转ASCII码string.byte(s[,i[,j]])返回字符s[i],s[i+1],... ,s[j]的内部数字编码。i的默认值是1;j的默认值是i。print(string.byte("a"))print(string.byte("fightsyj", 1, 5))-- 97-- 102 105 103 104 116ASCII码转字符string.char(···)接收零或更多的整数。返回和参数数量相同长度的字符串。其中每个字符的...原创 2021-03-02 16:08:03 · 6735 阅读 · 0 评论 -
Lua do-end
在 Lua 中,使用 do-end 将一条或多条语句包起来作为一个语句块儿(block),形成一个作用域,在这个作用域中定义的局部变量只在当前作用域有效,出了作用域之后就会被垃圾回收器自动回收!当然,在这个作用域中定义的全局变量不受作用域的影响!...原创 2020-12-16 16:54:25 · 2196 阅读 · 0 评论 -
Lua实战之不使用循环逆序输出一个数组
Description在不使用循环,不逐一赋值的前提下,逆序输出一个数组。e.g.数组:{1,2,3,4,5}输出:54321Implemention方案:使用递归local tbl = {1, 2, 3, 4, 5}function reversePrint(key) print(tbl[key]) if key == 1 then return end return reversePrint(key - 1)endreversePrint(...原创 2020-11-17 14:12:30 · 1755 阅读 · 7 评论 -
Lua实战之number转带单位的字符串(万、亿)
Description将number类型的数字转成指定格式的字符串!规则如下: 最多保留两位小数(舍去从第三位小数开始的值); 大于等于1万,以万为单位。大于等于1亿,以亿为单位。 e.g.0.009->0-88.8->-88.8123.456->123.45-888.888->-888.881234000->123.4万-8888888->-888.88万12300000000->...原创 2020-08-04 20:13:33 · 1554 阅读 · 0 评论 -
Lua实战之拆分整数
Description将指定的数字按规则由大到小拆分成多个更小的数!e.g.被拆分的数字:23拆分规则:{1,2,3}拆分结果:7个1,1个2Implementionfunction splitNum(targetNum, ruleTbl) if #ruleTbl == 0 then return targetNum end for i = #r...原创 2020-04-19 18:56:56 · 1359 阅读 · 0 评论 -
Lua中保留两位小数
在使用Lua进行开发的时候,经常会遇到保留n位小数的问题,这里以保留两位小数为例,记录一下需要注意的地方!在选择处理方案之前,首先要确认需求,搞清楚保留两位小数是指小数点后第三位四舍五入还是从小数点后第三位开始直接舍去!Case 1Desc小数点后第三位四舍五入Methodstring.format("%.2f",num)Demolocal num1, num2...原创 2020-04-18 11:41:46 · 22067 阅读 · 0 评论 -
Lua实战之整体移动table中的元素
DescriptiontestTbl={1,2,3,4,5,6}将 testTbl 看做首尾元素相邻的环,请实现将表中所有元素向前移动 n 个位置!e.g.n=1移动之后的结果为:{2,3,4,5,6,1}n=2移动之后的结果为:{3,4,5,6,1,2}Implementionlocal LogManager = req...原创 2020-03-12 16:17:06 · 1819 阅读 · 0 评论 -
Lua中字典型table的增删操作
tabletable(表)是Lua中一种基础且使用频率极高的数据结构,他的本质是“关联数组”!根据内部元素的不同,我们一般可以将table分为数组型table和字典型(键值对型)table:数组型table:将元素的值顺序存储到table中,元素的索引为从1开始连续递增的整数。例如:arrayTbl={3,5,7}arrayTbl对应的key为:1,2,3字典型...原创 2020-01-03 21:02:05 · 3320 阅读 · 0 评论 -
Lua中loadstring的使用
Lua中loadstring的使用引子分析实现溯源引子将一个table类型的字符串转成table!例如:"{id=1,num=666}"->{id=1,num=666}分析如果暴力解析这个字符串,也是可以将这个table解析出来的,但是这种做法太莽了,当table的结构比较复杂的时候,就有点蛋疼了!使用loadstring就优雅多了...原创 2019-10-24 08:55:06 · 7377 阅读 · 0 评论 -
Lua实战之洗牌算法
Description打乱指定table中的元素!Implemention-- 设置随机数种子math.randomseed(tonumber(tostring(os.time()):reverse():sub(1,6)))-- 洗牌算法function shuffle(targetTbl) local tblLen = #targetTbl while(tb...原创 2019-10-15 09:53:17 · 1175 阅读 · 0 评论 -
Lua实战之统计字符串中任意字符出现的次数
Description求出指定字符串中任意字符出现的次数!e.g.指定字符串:"Hello World!""H"出现1次,"e"出现1次,"l"出现3次,"o"出现2次,"W"出现1次,"r"出现1次,"d"出现1次,空格出现1次,"!"出现1次!Implementionlocal LogManager = require("LogManager")local testSt...原创 2019-08-03 17:36:55 · 4134 阅读 · 0 评论 -
Lua实战之判断连续
目录DescriptionImplementionPlan APlan BDescription判断表中的数是否连续,0可以代表任意数!e.g.{5, 8, 0, 1, 4, 2, 0, 6}是连续的!ImplementionPlan Alocal testTbl1 = {5, 8, 0, 1, 4, 2, 0, 6}function jungle...原创 2019-08-03 15:11:55 · 1034 阅读 · 0 评论 -
Lua实战之table.remove
Descriptionlocal tbl1 = {1, 2, 2, 3, 3, 3, 4, 5, 5, 5, 6}local tbl2 = {1, 2, 3, 3, 5, 6}删除tbl1中存在于tbl2中的元素,使删除之后tbl1的值为:{2, 3, 4, 5, 5}Implementionlocal LogManager = require("LogManager")...原创 2019-07-06 10:54:12 · 657 阅读 · 0 评论 -
Lua中的require与package.loaded
require (modname)原创 2019-05-19 20:33:05 · 10223 阅读 · 0 评论 -
Lua之面向对象的实现
Lua本身是不支持面向对象的,但是可以利用table和元表、元方法进行面向对象的模拟!以下是Cocos2d-lua中面向对象的实现:classfunction class(classname, ...) local cls = {__cname = classname} local supers = {...} for _, super in ipairs(supe...原创 2019-05-18 17:32:27 · 1071 阅读 · 0 评论 -
Lua之元表和元方法
元表Lua中的每个值都可以有一个元表!这个元表就是一个普通的Lua表,它用于定义原始值在特定操作下的行为。如果你想改变一个值在特定操作下的行为,你可以在它的元表中设置对应域。例如当你对非数字值做加操作时,Lua会检查该值的元表中的"__add"域下的函数。如果能找到,Lua则调用这个函数来完成加这个操作。在Lua中,你不可以改变表以外其它类型的值的元表(除非你使用调试库),若想改变这些非表...原创 2019-05-18 10:43:11 · 920 阅读 · 0 评论 -
Lua错误处理之error、assert、pcall和xpcall
Lua错误处理errorassertpcallxpcallerrorerror (message [, level])中止上一次保护函数调用,将错误对象 message 返回。 函数 error 永远不会返回。当 message 是一个字符串时,通常 error 会把一些有关出错位置的信息附加在消息的前头。 level 参数指明了怎样获得出错位置。 对于 level 1 (默认值),出错...原创 2019-05-17 21:58:37 · 6900 阅读 · 0 评论 -
Lua中使用math.floor产生bug的问题
引子:local testNum1 = 38.48print("testNum1 = ", testNum1)local testNum2 = testNum1 * 100print("testNum2 = ", testNum2)local testNum3 = math.floor(testNum2)print("testNum3 = ", testNum3)--[[...原创 2019-05-09 08:49:32 · 4864 阅读 · 3 评论 -
Lua中的尾调用与尾递归
尾调用何为尾调用?当一个函数是另一个函数的最后一个动作时,该调用就是一条尾调用!e.g.function testFuncA(arg) print(arg)endfunction testFuncB() local str = "尾调用test" return testFuncA(str) -- 函数testFuncB的最后一步操作是调用函数tes...原创 2019-03-08 19:38:48 · 2628 阅读 · 0 评论 -
Lua打印堆栈信息
debug.traceback([thread,] [message[, level]])如果message有,且不是字符串或nil,函数不做任何处理直接返回message。否则,它返回调用栈的栈回溯信息。字符串可选项message被添加在栈回溯信息的开头。 数字可选项level指明从栈的哪一层开始回溯 (默认为 1 ,即调用traceback的那里)。方法使用print(debug....原创 2019-03-06 20:18:01 · 18730 阅读 · 0 评论 -
Lua 小技巧总结
1、变量名一般用小驼峰命名法,如userName;类名一般用大驼峰命名法,如LoginView!2、Lua中有一种特殊的变量名:_,常用来表示可以被忽略的、不会使用到的变量,常使用在循环中!local testTbl = {id = 1, num = 666, level = 100}-- _是一个特殊的变量,代表遍历的时候不会使用keyfor _, v in pairs(test...原创 2019-02-20 20:03:07 · 1811 阅读 · 0 评论 -
Lua迭代器pairs与ipairs的区别
pairs:pairs会输出table中的值和键值对,并且在输出的过程中先按顺序输出值,再乱序输出键值对。ipairs:ipairs并不会输出table中存储的键值对,会跳过键值对,然后按顺序输出table中的值。遇到nil结束遍历!local testTbl = {"hello", num = 666, "world", nil, level = 100, "abc"}for k,...原创 2019-01-21 23:31:43 · 1838 阅读 · 0 评论 -
Lua基础之运算符
运算符Lua中的运算符一般包括这四类:算术运算符、关系运算符、逻辑运算符和其他运算符!算术运算符Lua中的算术运算符如下:一元运算符:-(负号)二元运算符:+(加)、-(减)、*(乘)、/(除)、^(幂)、%(取余)local a, b = 10, 3print(-a, -b) -- 负号print(a + b) -- 加print(a - b) -- 减p...原创 2019-01-20 21:25:42 · 2129 阅读 · 0 评论 -
Lua基础之数据类型
数据类型Lua是动态类型(运行时)的语言,变量不需要类型定义,只需要为变量赋值!在Lua中有8个基本类型分别为:nil、boolean、number、string、userdata、function、thread和table。nil一个未被赋值的变量默认为nil,将一个变量赋值为nil可以删除这个变量!local testprint(type(test)) -- nil...原创 2019-01-20 17:42:25 · 2864 阅读 · 0 评论 -
Lua中使用点号与冒号的区别
Lua中使用点号(.)与冒号(:)的区别在于:在函数定义的时候使用:会默认接收self参数; 在函数调用的时候使用:会默认传递调用者自己为参数; 在函数定义和调用的时候使用.则需要显式接收或者传递self参数。local test = {}function test:funcA() print("I`m funcA")endfunction test.funcB(self)...原创 2019-01-11 20:16:32 · 3124 阅读 · 0 评论 -
Lua中尽量不要使用os.clock(),有坑
在游戏开发的时候,偶尔会遇到需要对按钮点击添加cd的需求,那么就需要比较两次点击之间的时间间隔!首先想到的就是使用Lua中的系统函数os.clock()。os.clock()返回程序使用的按秒计CPU时间的近似值。那么就可以很愉快的搞定这个需求了:local test = {}function test:clickBtn() local curTime = os.cl...原创 2019-01-11 01:40:36 · 16297 阅读 · 0 评论 -
Lua中使用table.concat连接大量字符串
在使用Lua的过程中,当遇到需要连接大量字符串的时候,尽量不要使用字符串连接符..进行连接,因为Lua中的字符串是不可变的,每进行一次连接就会复制生成一个新的字符串,随着字符串的长度越来越长,复制操作也会越来越耗时!这种情况采用table.concat进行连接效率会高很多!table.concat(list[, sep[, i[, j]]])提供一个列表,其所有元素都是字符串或数字,返回字...原创 2019-01-10 21:39:57 · 4858 阅读 · 0 评论 -
Lua实战之table去重
在开发过程中,有时候会遇到需要对table中的元素进行去重的情况,就是说如果table中有多个相同的元素,只保留一个!直接上代码:local targetTbl = {1, 1, 2, 3, 3, 3, 4, 5, 5} -- 需要去重的目标tabledump(targetTbl, "targetTbl")--[[- "targetTbl" = {- 1 = 1- ...原创 2018-12-28 20:04:14 · 7451 阅读 · 0 评论 -
Lua打印table的工具函数dump
在Lua中,print是不能直接打印出table里面的数据的,如果用循环遍历打印遇到嵌套table的话也是很不友好的!local tblTest = {1, a = {111, 222}, "ccc"}print(tblTest)-- table: 00A17E20for k, v in pairs(tblTest) do print(k, v)end--[[1 12 c...原创 2018-12-27 21:25:13 · 9934 阅读 · 0 评论 -
Lua中时间函数的用法整理
os.time([table])1、不传参数,返回当前系统时间的时间戳!print("os.time()->", os.time())-- os.time()-> 15454723202、传入一个table,返回table内容所表示时间的时间戳!这个table必须包含域year、month和day,还可以包含hour、min、sec以及isdst,关于这些域的详细描述如...原创 2018-12-22 21:47:51 · 11358 阅读 · 0 评论 -
Lua handler的使用
在使用Lua进行开发的过程中,经常会遇到需要回调函数的情况,就是将一个函数作为参数传入,在特定事件触发的时候调用这个函数!这时候,handler函数就能发挥作用了,handler函数定义如下:function handler(obj, method) return function(...) return method(obj, ...) endend可...原创 2018-12-19 00:44:23 · 5259 阅读 · 0 评论 -
Lua中实现字符串分割函数split
方法一:function split(input, delimiter) input = tostring(input) delimiter = tostring(delimiter) if (delimiter == "") then return false end local pos, arr = 0, {} for st, sp in func...原创 2018-12-18 20:35:44 · 17913 阅读 · 3 评论 -
Lua中忽略字符串首尾的空白字符
空白字符一般包括空格、换行符\n、制表符\t以及回到行首符\r,当然如果有特殊需求需要将其他的字符也当做空白字符也都是可以的!-- 忽略字符串头部的空白字符function ltrim(input) return (string.gsub(input, "^[ \t\n\r]+", ""))end-- ltrim testlocal test1 = " h...原创 2018-12-17 21:36:34 · 9981 阅读 · 0 评论 -
Lua中的浅拷贝和深拷贝
浅拷贝在Lua中,使用赋值运算符"="进行浅拷贝的时候,分两种情况:1、拷贝对象的类型是string、number、boolean这些基本类型的时候,会进行复制,创建一个新的对象,拷贝出来的对象和原来的对象互不影响,所以修改拷贝出来的对象的值不会影响到原来的对象的值!2、拷贝对象的类型是table的时候,则是直接进行引用,拷贝出来的对象和原来的对象实际上是同一个对象,所以修改拷贝出来的...原创 2018-12-17 20:43:12 · 9937 阅读 · 4 评论 -
Lua中模拟三目运算符
Lua的运算符里面是没有三目运算符的,所以只能通过逻辑运算符and和or来模拟实现三目运算符的功能!先了解一下Lua的基本数据类型boolean以及逻辑运算符and和or:booleanfalse:nil和falsetrue:除nil和false之外的都为true,当然0也为trueandA and B:若 A 为 false,则返回 A,否则返回 BorA or ...原创 2018-11-27 02:01:07 · 2934 阅读 · 0 评论