lua 不完全快速指引 | server 运维论坛-大发黄金版app下载
基础
- 数据类型 - number,string
- boolean, nil
- lua 把 false 和 nil 看作是 false,其他的都为 true
- table 类似php中的关联数组,但数字下标是从1开始
- 数组的索引可以是数字,字符串或表类型
- 通过构造表达式{} 来完成, k=v 表示关联,可以用.访问
- function 一类公民
- 支持多返回值
- 支持可变参数 …
- {…} 表示一个由所有变长参数构成的数组
- 函数体内可以通过 select(“#”,…) 来获取可变参数的数量
- select(n, …) 用于返回从起点 n 开始到结束位置的所有参数列表
- userdata 表示任意存储在变量中的c数据结构
- thread 表示执行独立线程,用于执行协同程序 coroutine
 
- 变量 - 全局变量
- 局部变量
- 表中域
 
- 赋值 - 支持多值
- 支持平行交换
 
- 循环 - for tmpvar=start,end,step do … end
- while … do …end
- repeat…until
 
- 分支语句 - 不使用大括号来表示代码块,通常用end (do end,then end)
- if … then … else … end
- if … then … elseif … then … else … end
 
- 运算符 - 关系运算符 ~= 不等于
- 逻辑运算符 and or not
- 其它运算符
- .. 连接两个字符串
- #一元运算符 返回字符串或表的长度
 
常规
- 默认声明的变量是全局变量 
- 没有被声明的变量的值是nil 
- 支持多值返回 
- table - 数字下标 从1开始
- 字符串下标 用双引号访问,支持类似vue中的计算属性
- 方法 table.insert, table.remove
 
- 全局表 _g 存储所有全局变量 
- 在 lua 中特例 - 不等于用 ~= 表示不等于
- 支持 and or not
- ..字符串拼接
- 不支持自增与自减计算
 
- 迭代器 - ipairs 遇到 nil 自动停止迭代
- pairs 迭代所有类型下标
 
- table 全局泛型函数 - table.concat (list [, sep [, i [, j]]])
- table.insert (list, [pos,] value)
- table.move (a1, f, e, t [,a2])
- table.pack (···)
- table.remove (list [, pos])
- table.sort (list [, comp])
- table.unpack (list [, i [, j]])
 
模块与包
- 加载机制 - lua5.1 加入了标准的模块管理机制
- require 会搜索存放在全局变量 package.path 路径的 lua 文件
- lua_path 可以自定义设置,在当前用户根目录下打开 .profile 文件
 
- require - 目录层级使用.来分隔
- 只会运行一次
- 从 package.path 包中加载
- 通过返回表来实现模块导出功能
 
- 元表 metatable - 元表本身是一个定义元方法的键值表,该方法可以重定义对表的操作行为 
- 允许改变普通 table 的行为,每个行为关联了对应的元方法的特定键值对 
- 处理元表元素的函数 
- setmetatable(table,metatable) 对指定的table设置元表metable,关联元表 
- 若元表(metatable)中存在 __metatable 键值,setmetatable 会失败。 
- getmetatable(table) 返回对象的元表 metatable 
- lua 提供的默认元表规则 
- 索引操作 
- __index 当表中的键不存在时被调用 补偿操作 
- __newindex 当对表中的键赋值时被调用 追踪写操作 
- 算术操作 
- add,sub,mul,div 对应加减乘除 
- mod,pow,__unm 取模,幂运算,一元负运算 t1 % t2, t1 ^ t2, -t 
- 比较操作 eq,lt,__le 
- __concat 定义表连接操作 t1..t2 
- 其它操作 
- __tostring 修改表的输出行为 如 tostring(t) 
- __call 在lua调用一个使用了元表值时执行 
- 支持自定义元方法 
- 自定义非默认元方法 
- setmetatable(tb,{__index = {hi=funcion() return self.name end}}) 
- t:hi() 与 t.hi(t) 等价,前者是后者的语法糖 5.1 
 
标准库
- string
- io- io.open io.close io.seek io.input io.output io.read
- io.type io.tmpfile io.type io.flush io.lines
 
- file- file.flush
 
协同 coroutine
分时复用单线程
协同程序是一种特殊的线程,可以暂停和恢复其执行,从而允许非抢占式的多任务处理
- 比较 - coroutine 允许在同一个线程内实现多个协程的切换,通常由程序手动控制调度
- 协同程序需要彼此协作运行,在任一指定时刻只有一个协同程序在运行
- 拥有独立的堆栈,独立的局部变量,独立的指令指针,与其它协同程序共享大部分内容
- 子程序是封装特定功能的代码块,用于实现特定的功能逻辑,如函数
- goroutine 是go语言中轻易级线程,由go运行时进行调度管理
 
- 协同程序由 coroutine 模块提供 - coroutine.create() 创建 
- function coroutine.create(f: fun(...any):...unknown) -> thread
- coroutine.resume() 开始或继续协程, 与coroutine 交互 
- 支持传递值 
 - function coroutine.resume(co: thread, val1?: any, ...any) -> success: boolean 2. ...any- python的生成器(yeild)主要用于按需生成值,并通过next()和send()方法与外部代码进行简单的交互
- python 中的 await
- 挂起当前协程,允许其他协程开任务在事件循环中继续执行
- 等待异步操作完成, 如等待一个异步操作的结果,如网络请求,文件io
- 恢复协程执行
- 实现非阻塞操作
- coroutine.yield() 挂起,发出值
- (async) function coroutine.yield(...any) -> ...any
- coroutine.status() 查看状态
- coroutine.wrap() 返回一个函数,类create
- coroutine.running() 返回一个coroutine的线程号
 
错误处理
- 语法错误 
- 运行错误 
- 错误处理 - function assert(v?:- , message?: any, ...any) -> - 2. ...any 
- function error(message: any, level?: integer)终止正在执行的函数
- level=1[默认]:为调用error位置(文件 行号)
- level=2:指出哪个调用error的函数的函数
- level=0:不添加错误位置信息
 
垃圾回收
lua 采用了自动内存管理
提供了函数collectgarbage ([opt [, arg]])用来控制自动内存管理
本作品采用《cc 协议》,转载必须注明作者和本文链接
