Lua-Xmind知识点记录(持续中)

自己边看文档边记录的,后面的部分有些不全。
下面的内容全部复制,粘贴到X-mind就可以了。
格式可能会出点问题,不过就自己动手调调吧。

Lua
特点
易于扩展、易于整合、简单、与平台无关
大小写敏感
动态类型语言
单行注释–,多行注释–[[xxx–]]
基础
全局变量
定义:无需定义,默认全局a=10
特点:置nil等于删除
Chunks
意义:一段完整的Lua代码,可看作一个独立的执行单元
数据类型
Bolleans
特点:fasle和nil为假,其余为真
Numbers
特点:实数,可表示整数和浮点数,多种表达方式,可处理任何长整数而不考虑误差
与String自动转换
String
特点:8位字节,不可修改,处理高效
表示形式
“str”
需要转义
[[str]]
可换行,无需转义
Functions
可存储在变量中,可作为参数,可作为返回值
Userdata
可将C数据存放在lua变量中
子主题 2
表达式
关系运算符
~=不等于
类型不同不等于
nil只和自己相等
tables/userdata/functiongs都用引用来比较
逻辑运算符
and
若a为假,返回a,否则返回b
or
若a为真,返回a,否则返回b
not
返回结果只有true false
and优先级高于or,但是低于其它运算符
特点
三目:x=(a and b) or c
a为真,返回b,此时b为真,所以返回b
a为假,返回a,此时a为假,所哟返回c
链接符号:…
当一个数字写在后面时记得加空格防止解释错

形式
普通a={“a”,2,f()}
可用索引下标读取
键值对a={a=“1”,b=2,[“123”]=3}
[“123”]=3}和[123]=3是不同的
特点
初始下标为1
键值对可用a.x读取
内容类型不限,可混合
可用分号分割不同类型的表元素
构造:a={内容}就叫构造了,仅影响表的初始化
语法
连续赋值:x,y=y,x
可接函数的多个返回值
局部变量
代码块限定:do…end
循环控制语句
while…do
repeat…until
for i=1,10,1 do
for i,v in ipairs(table) do
pair的有序版
break和return
只能在块的最后,可用do…end改变
函数
调用
()调用
:调用,默认将本身作为第一个参数
loadstring调用
尾调用:f调用g后无需处理其他事情,此时可作goto用
参数
数组参数:f(unpack(array)):返回array的所有元素作为函数的参数
可与可变参数配合使用
可变参数:f(a,b,…)
arg数组存储所有…的参数
arg={5,8;n=2}
虚参数:_,不接收返回值只占位
命名参数:f(o)
调用f({name=xx,id=xx})表作为了o
调用f(name=xx,id=xx)函数中pack一下arg,然后再用
返回值
return f():返回f的所有返回值
注意,仅当调用作为最后一个参数时才会返回多值
(f())强制只返回第一个
普通多值返回
特点
可以是lua写的也可以是其他语言,注册在lua
闭包
嵌套的函数可以访问它外部函数的变量,也就是upvalues
参数也可作为upvalue,以传入参数为基准
使用闭包时,通常我们获得的是return 的那个f,而f中的变量去它的上层找,实现了其作用
局部函数
注意:local f() 的定义中调用f会在全局上找,需提前声明
如果表是local而函数非local,此时函数也local
局部递归应当注意,return递归部分会去全局找。当这个局部函数本身被编译时,递归部分还不知道这个局部函数
尾调用
尾调用时不能和现在的函数有关联,比如return f+1,f执行完还得回来+1
迭代器
定义:知道来自于哪和去往哪里
一个工厂和一个闭包,变量在工厂,改变在闭包
实现
闭包做法:迭代变量放入外部,每次调用变量+1
无闭包:将参数作为迭代变量,改变参数和返回值
要点就是每次执行改变状态和返回值
自己写的使用时for e in myiter。e为每次的返回值
编译调试运行
执行
dofile执行/内核是loadfile返回编译的chunk
loadstring:执行字符串。每次调用重新编译,全局环境
require
加载后会放在package.loaded[module_name] 中避免重复加载。改名会重复。
搜录路径?和;
动态链接库
loadlib,不打开库,而是返回初始化函数
错误处理
函数
error(信息,层级)
0不添加位置,1调用error的位置,2调用error函数的函数的位置
assert(执行,信息)
pcall(执行)捕获错误,不停止程序
Tracebacks
xpcall(执行,错误处理函数)
debug.debug提供lua_debug>操作符
debug.traceback根据调用栈构建错误消息
协程
状态
挂起态:开始时默认挂起,coroutine.yield() 也会导致挂起
yield挂起后传入的resume参数是yield的返回值
运行态:coroutine.resume使得挂起的协程运行
resume可接收yield的(x,y)括号中的值,true x y
停止态:协程运行完成
协程结束的return会给到resume
创建
coroutine.create(function (a,b)
xxx
end)
此处的参数即为resume可传参数
创建时传入的resume参数时作为function的参数
coroutine.warp不返回协同本身而是返回一个函数,当函数调用时resume协同
table
数据结构
数组:lua表默认是数组,大小动态增长,下标从1开始
矩阵
数组表示:表的元素是另一个表
行和列计算:行*n+列
链表
关键在于list={next=list,value=v}右侧list是list本来的地址。左侧list则是这个新表的地址。
队列
使用索引下标:first,last
入队列:last+1,arr[last]=value
出队列first+1
集合
[对象]=true
string拼接
table.insert
table.concat
数据文件与持久化
dofile用法
定义处理函数
将数据处理为函数名{xx,xx}
此时dofile会自动触发函数
序列化
就是根据不同的值类型,iowrite不同的句子
表的处理
不循环:直接递归,将表内容当作普通值处理
循环:使用save表存已经处理过的表。若已存直接输出内容,若未存,递归处理。=》有嵌套的情况不会递归而是输出已处理过的内容
元表元方法
算术运算
__add
__mul
__sub
__div
__unm负
__pow幂
关系运算
__eq等于
__lt小于
__le小于等于
库定义
__tostring
__metatable
表相关
__index
不存在时触发
若对应函数,则将table和缺少的域做参数进行函数处理
若对应表,则从表中寻找对应方法
rawget替换不触发
__newindex
对不存在的赋值时触发
若对应函数,则表,键,值为参数
若对应表,则对表对应的方法进行赋值操作
rawset替换不触发
设置默认值
index直接改
或是外面封装一层,比如t.
index中直接返回t.。好处是多个表可用一个mt
或是用共有表的地址作为key
监控表
分成实际表和监控表。对监控表的元方法中会改变实际表的内容
保证了对任何,甚至已存在表中的元素都可以触发元方法
多表监控也可以用共有表的地址作key
只读表
运用监控表思想。返回监控表对象。那么对随便的__newindex都可以触发。而__index返回原始表
环境
全局表_G
setfenv(level,table)
设置函数环境,1表示当前函数,2表示调用该函数的函数
使用时保存有用的全局环境
package
本质是个表
好用的方法
1.全员类名.功能,直观,缺点:非local的function处于全局
2.使用环境,优点,干净。缺点,复杂
函数只有使用的时候会自动加载。自动加载时会创建一个空表并将__index指向package。并保存到空表。意味着第一次运行是去package找,后面不用
面向对象

代表着self参数,表示函数作用的对象

实现机制:metatable,基类a,实例b。b的__index是a。此时调用b.add会去a中找add方法
基类的metatable可为自己
在new函数中
1.创建表对象,返回给new出来的对象
2.将表对象的metatable设为self,此时类:new的self是类本身。
3.将slef的__index设为类本身。也就是new出的对象的元表的__index方法指向类本身
关键是分辨self和self的意义,此处的self是作为元表
继承
实现机制,同样向上继承。比如基类a,子类b,实例c。b中实现了add,a中实现了new。然后一路往上
多重继承
实现机制:__index对应函数。该函数中遍历寻找方法
私有性
实现机制:状态表和操作表。首先一个大函数作为类,类中的self域为私有变量。类的每个方法用闭包的方式返回私有变量
weak表
特点
全局变量都不是垃圾,需要手动清理
不被引用的对象会被回收
weak表中当一个对象只存在于weak表,他会被回收
只有对象可以被手机,值类型不会
类型
weak key
k
weak value
v
weak
key或value被收集则回收
方法:__mode域
记忆函数的清理
使用weak检测当前时间未被引用的对象清理
对象属性关联
obj:value
对象当作key对于内容。当我们不需要时利用weaktable可以回收对象
当需要为一个对象添加新的属性时,但是又不想在原对象中添加,或者需要将属性私有化时
标准库
数学库
table库
string库
-1指向最后一个字符
string.format
类似print的输出模式
%d十进制
%x十六进制
%o八进制
%f浮点数
%s字符串
%.4f小数点后四位
%02d固定两位显示
模式匹配
字符类
. 任意字符
%a 字母
%c 控制字符
%d 数字
%l 小写字母
%p 标点字符
%s 空白符
%u 大写字母
%w 字母和数字
%x 十六进制数字
%z 代表 0 的字符
大写为小写的补集
模式修饰符
+ 匹配前一字符 1 次或多次
* 匹配前一字符 0 次或多次
- 匹配前一字符 0 次或多次
? 匹配前一字符 0 次或 1 次
其他特殊字符
()分组匹配,每个括号都是一个捕获对象
%转义特殊字符
[]字符集,匹配[]中任意一个字符
^只匹配目标串的开始部分
匹配字符串结尾位置。比如匹配 匹配字符串结尾位置。比如匹配%d+ 匹配字符串结尾位置。比如匹配,那么只有字符串结尾是数字才有结果
IO库
操作系统库
Debug库
CAPI

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值