lua 不完全快速指引

基础

  • 数据类型

    • 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?: <T>, message?: any, ...any) -> <T> 2. ...any
    • function error(message: any, level?: integer) 终止正在执行的函数
    • Level=1[默认]:为调用error位置(文件+行号)
    • Level=2:指出哪个调用error的函数的函数
    • Level=0:不添加错误位置信息

垃圾回收

lua 采用了自动内存管理

提供了函数collectgarbage ([opt [, arg]])用来控制自动内存管理

本作品采用《CC 协议》,转载必须注明作者和本文链接
pardon110
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
开发者 @ 社科大
文章
134
粉丝
24
喜欢
101
收藏
55
排名:106
访问:8.9 万
私信
所有博文
社区赞助商