lua 不完全快速指引 | server 运维论坛-380玩彩网官网入口
基础
数据类型
- 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 协议》,转载必须注明作者和本文链接