lua 脚本基本语法
前言
Lua
/'luːə/
是一个小巧且速度极快的脚本语言,由标准 C 编写而成,几乎在所有操作系统和平台上都可以编译运行,是作为嵌入式脚本的最佳选择。本人常用它来对文本内容进行批处理。
Lua 简介
1、lua 概述、官网、资料
Lua 是一个小巧的脚本语言,标准 C 编写而成,它可以被 C/C++ 代码调用,也可以反过来调用 C/C++ 的函数,几乎在所有操作系统和平台上都可以编译、运行。Lua 并没有提供强大的库,一个完整的 Lua 解释器不过 200KB,但它在所有脚本引擎中速度是最快的,是作为嵌入式脚本的最佳选择。Lua 是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个由 Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo 三人所组成的研究小组于 1993 年开发的。
安装 lua 后,其包括三部分:
- lua(解释器):
用于运行 lua 脚本文件。例如:lua test.lua
命令是运行 test.lua 脚本文件。- luac(编译器):
用于加密 lua 脚本文件(但可逆向解密,参考网文)。例如:lua -o t.lua test.lua
命令对 test.lua 脚本文件加密并生成 t.lua 加密文件,使用同样方式运行脚本加密文件即可:lua t.lua
。- liblua.a(静态库):
用于集成到其它程序中,例如编译一个 C 程序,调用 lua 操作 API 运行 lua 脚本。如果需要动态库,则需要修改 Makefile 文件并重新编译,具体请参考网文。资料:官网、网文教程、菜鸟教程、Lua 5.3 API 参考手册、Lua 5.3 参考手册
、Lua API、中国顶级程序员-网游大咖-云风(吴云洋)-博客 + 他的git仓库 + Lua 编程技巧
Lua 安装
1、lua 解释器下载与安装
|
|
2、lua 脚本的编写与运行
● 方法一:(1)编写脚本文件(但不指出 lua 脚本解析器),(2)在命令窗口运行脚本。
|
|
|
|
● 方法二:(1)编写脚本文件(首行指出 lua 脚本解析器),(2)在命令窗口运行脚本。
|
|
|
|
● 说明三:lua 脚本解析器支持交互式编程
|
|
3、lua 在 Windows 上安装
● 方法一:安装现成集成环境(不过 lua 的版本则比较旧)
- 例如:安装 SciTE 的 IDE 集成环境后,直接在命令窗口运行 lua 脚本文件即可:
|
|
● 方法二:自己编译自己安装(可以使用 lua 的最新版本)
- 下载 TDM-GCC 编译工具,不需要勾选检测是否最新版本,直接点击
Creat
安装即可(图示),最后在命令窗口输入gcc -v
可查看 gcc 版本。 - 下载 lua 源代码,解压文件并编译。【网上也有已编译好的 lua】
|
|
- 将 lua 加入环境变量(图示),但建议直接把
lua.exe、luac.exe、liblua.a、lua54.dll
剪切到C:\Windows
目录下。
备注:
- 关于 TDM-GCC:是为 windows 系统打造的编译器套件,其衍生自 MinGW 和 MinGW-w64 的项目,分为 32 位与 64 位两个版本,32 位版本的编译目标仅兼容 32 位应用程序,64 位版本的编译目标兼容 32 位应用程序与 64 位应用程序,最新的官方二进制版本为 GCC 10.3.0。更多的编译构建工具知识,请移步《linux-编译-linux 编译构建工具》。
- 参考:TDM-GCC 安装 lua、MinGW 编译 lua、MinGW 安装文件区别
Lua 语法
1、lua 概述
lua 由标准 C 编写而成,可以被 C/C++ 代码调用,也可以反过来调用 C/C++ 的函数,基于此我们可以很容易想像出它的语法一定会与 C 语言很相似。其中独立语句可以使用
;
分号分隔,也可以不用。还有特别说明一下,Lua 的所有变量其实都是字符,例如直接打印一个函数返回值return 100
,虽然它是number
数据类型,但打印结果还是字符串:100。
2、lua 关键字
一、lua 的关键字:
说明一、lua 关键字主要包括:声明、函数、跳转、返回、结束、判断、循环、真假、与或非
等语句关键字。下面列出 22 个关键字:
关键字 | 关键字 | 关键字 | 关键字 |
---|---|---|---|
local | if | then | true |
function | elseif | false | |
goto | else | nil | |
break | for | in | or |
return | while | do | and |
end | repeat | until | not |
二、Lua 的数据类型:
说明二、Lua 数据类型主要包括:空值、布尔值、数值、字符串、数据、线程、表
这些数据类型,它们通过type()
函数返回值获得(返回为字符串,由字符串单词指出数据类型)。下面列出 8 个数据类型:
关键字 |
含义 |
---|---|
“nil” | 空值(在条件表达式中相当于 false) |
“boolean” | 布尔值,包含两个值:true 和 false |
“number” | 表示双精度类型的实浮点数 |
“string” | 字符串由一对双引号或单引号来表示 |
“function” | 由 C 或 Lua 编写的函数 |
“userdata” | 表示任意存储在变量中的 C 数据结构 |
“thread” | 表示执行的独立线路,用于执行协同程序 |
“table” | Lua 中的表其实是一个"关联数组"(associative arrays),数组的索引可以是数字、字符串或表类型。在 Lua 里,table 的创建是通过“构造表达式”来完成,最简单构造表达式是{} ,用来创建一个空表 |
补充说明 | type() 返回都是字符串! |
|
|
三、Lua 的运算符:
说明三、Lua 运算符主要包括:算术、关系、逻辑、其它
这几类运算符。它们有不同的优先级(强烈建议使用()
指定),下面列出 8 级优先级:
优先级 |
运算符 |
备注 |
---|---|---|
最高 | ^ | 连续几个^则是优先从右到左组合 x^y^z == x^(y^z) |
↑ | not - | - 为负号 |
│ | * / % | |
│ | + - | |
│ | .. | |
│ | < > <= >= ~= == | |
│ | and | |
最低 | or |
|
|
四、Lua 的注释:
说明四、Lua 注释主要包括:行、块
两类注释。下面列出 2 种注释演示:
|
|
3、lua 变量
一、Lua 的变量:
说明一、Lua 变量有三种类型:全局变量、局部变量(local
声明)、表中的域,它们的默认值(没有初始化时)均为nil
。下面是展示变量的声明和初始化:
|
|
二、Lua 的表/数组:
说明二、Lua 表/数组主要分为:一维数组、多维数组。表/数组的元素组成:键(名)=值。关于数组与表区别:数组其实就是一个有序的表。关于我对【表员】和〖组员〗的定义:有或无《键名》的元素都称为【表员】,没有《键名》的元素称为〖组员〗。不建议〖组员〗的数值设置为nil
,否则会影响相关函数操作!
|
|
三、lua 的字符串:
说明三、字符串语法包括""
''
[[]]
,其中[[]]
中书写的特殊字符不需要转义。
|
|
说明四、对于使用[[]]
书写的字符串、或者通过文件方式读取的内容,lua 已自动为我们加入了转义符,所以无需关心特殊字符是否要转义。
特殊字符 |
字符 |
---|---|
\\ |
代表一个反斜线字符:\ (可见符) |
\' |
代表一个单引号字符:' (可见符) |
\" |
代表一个双引号字符:" (可见符) |
\a | 响铃 |
\b | 退格 |
\f | 换页 |
\n | 换行 |
\r | 回车 |
\t | 水平制表(HT)(跳到下一个TAB位置) |
\v | 垂直制表(VT) |
\0 | 空字符 |
\ddd | 3 位八进制数所代表的任意字符(如:\777 ) |
\xhh | 2 位十六进制所代表的任意字符(如:\xF5 ) |
4、lua 控制
一、循环控制语句:
说明一、循环控制语句包括:for do … end
、for in do … end
、while() do … end
、repeat … until()
四种语法。循环支持嵌套,可以使用beak
或goto
(语法:goto label2
和::label2::
)语句退出循环体。
|
|
二、流程控制语句:
说明二、流程控制语句包括:if then … elseif then … else … end
语法。流程支持嵌套,可以使用goto
(语法:goto label2
和::label2::
)语句退出执行体。其中 Lua 认为false
和nil
为 假,true
和非 nil
为 真(也就是说数值 0 也为真!)
|
|
5、lua 函数
函数语法:
function name() … end
。函数分为全局函数、局部函数(函数前加local
关键字即可)。函数入口可以是一个或多个参数,也可以是可变参数;出口可以返回一个参数或多个参数,也可以是可变参数(如:return a
、return a,b
、return "abcd"
、return ...
等)。
迭代器(iterator /ɪtə’reɪtə/):是一种可以遍历集合中所有元素的机制,其通过循环语句调用 迭代函数,逐一取出(遍历)符合条件的相关数据。技术特点:迭代函数在第一次被调用时初始化现场,之后调用后返回时会保持现场为下次接续调用准备(有点类似自动步枪,第一发手工上膛(初始化),之后射一发后会自动为下一发上膛)。关于迭代函数参考网文:lua 迭代器学习、Lua 迭代器与泛型 for
闭包(closure /‘kləʊʒər/):将一个函数写在另一个函数之内,那么这个位于内部的函数便可以访问外部函数中的局部变量,这项特性称之为词法域。
|
|
|
|
|
|
6、lua 模块
主要包括三方面:
1、lua 调用 lua(lua 模块)
2、lua 调用 C(lua 包)
3、C 调用 lua(lua 函数)。
关于 lua 与 c 之前传递参数,lua 使用模拟栈方式实现参数传递,其中-1
表示栈顶,1
表示栈底,具体可参考网文:Lua调用C/C++ → 4.1.堆栈结构解析
一、【lua 模块】之 lua 调用 lua 模块
- 【lua 模块】其实就是单独写的一个lua 脚本文件,它实质就是表,封装到一个 lua 脚本文件的全局表(表名与文件同名),其表员必须是有键名的表员。
- lua 模块路径搜索策略:函数
require()
→ 全局变量package.path
→ 环境变量LUA_PATH
→package.loadfile
→ 加载 Lua 脚本文件
|
|
|
|
二、【lua 包】之 lua 调用 c 语言编译库
- 【lua 包】其实就是使用 C/C++ 语言按 lua 标准专为 lua 编写的扩展模块,在 linux 下编译为 so 动态库文件(windows 为 dll),其极大的提高 Lua 的可扩展性和可用性。
- lua 包的路径搜索策略:函数
require()
→ 全局变量package.cpath
→ 环境变量LUA_CPATH
→package.loadlib
→ 加载 so 或 dll 库文件 - 关于 lua 包参考网文:c 语言的 lua 库编写
|
|
|
|
|
|
三、【lua 函数】之 c 调用 lua 函数
- 事前准备:由于 lua 源代码默认只编译生成【静态库】,但 c 程序需要调用其【动态库】才可编译运行!所以我们首先需要重新编译及安装 lua 软件。
- 关于 lua 堆栈操作:只有 c 调用 lua 需要手工 pop 栈,而 lua 调用 c 不需要。
- 关于 lua 堆栈网文:Lua 调用原理展示(lua 的堆栈)、网文2、网文3
|
|
|
|
|
|
|
|
7、lua 元表
Lua 提供了元表(MetaTable /‘metə/‘teɪbl/),允许我们改变 table 的行为,每个行为关联了对应的元方法。例如表:
tb = {}
,当tb[1] = "abc"
时,Lua 默认的行为就是新建一个键值,但如果使用元表的元方法可以改变这句表达式的行为,例如自动在值前面增加前缀"my-"
字符(具体如何改变行为,学习后面知识点),则打印键值print(tb[1])
信息为"my-abc"
而非"abc"
,这就是元方法改变 table 的行为。还有 lua 没定义表的一些操作,需要我们来实现。例如:tab1 + tab2
表示两个表相加,这句表达式意思是拼接两个表还是两个表所有键值相加?这就需要我们通过元方法来定义这句表达式实际行为。
关于元表参考网文:lua 元表详解
两个重要的函数 | 作用 |
---|---|
setmetatable(table, metatable) | 对指定 table 设置元表(metatable) |
getmetatable(table) | 返回对象的元表(metatable) |
元方法 |
表达式 |
表现 |
---|---|---|
__index | = | 基表没有的键的【元方法读】索引到【读元表】,其它情形的【元方法读写】表现为【读写基表】 |
__newindex | = | 基表没有的键的【元方法写(增)】索引到【写(增)元表】,其它情形的【元方法读写】表现为【读写基表】 |
__index __newindex |
= | 当这两个元方法定义为同一个元表,表现为同时读写(增)基表和元表 |
__call | 当函数调用(如:tab(a,b,c) 中的tab 原来是表,转化后则是个函数) |
|
__tostring | 转化为字符串(如:print(tab) 中的tab 原来是表,转化后则是字符串) |
|
__add | + | 自定义两个表相加tab + tabx 的行为 |
__sub | - | 自定义两个表相减tab - tabx 的行为 |
__mul | * | 自定义两个表相乘tab * tabx 的行为 |
__div | / | 自定义两个表相除tab / tabx 的行为 |
__mod | % | 自定义两个表相余tab % tabx 的行为 |
__unm | - | 自定义表取反-tab 的行为 |
__concat | .. | 自定义两个表连接tab .. tabx 的行为 |
__eq | == | 自定义两个表比较相等tab == tabx 的行为 |
__lt | < | 自定义两个表比较小于tab < tabx 的行为 |
__le | <= | 自定义两个表比较小于相等tab <= tabx 的行为 |
一、默认元方法设置元表(默认元方法是无法查询及修改元表的)
|
|
二、__index
元方法(基表没有的键的【元方法读】索引到【读元表】,其它情形的【元方法读写】表现为【读写基表】)
|
|
|
|
三、__newindex
元方法(基表没有的键的【元方法写(增)】索引到【写(增)元表】,其它情形的【元方法读写】表现为【读写基表】)
|
|
|
|
四、__index
__newindex
元方法两个应用案例
|
|
|
|
五、rawget(t,k)
rawset(t,k,v)
绕过__index
__newindex
元方法的限制
|
|
|
|
六、__call
元方法(使用元方法把 table 转化为函数使用)
|
|
七、__tostring
元方法(使用元方法把 table 转化为字符串)
|
|
八、__add
元方法(自定义两个表相加【完全自定义】,只针对数组数据,否则可能会影响结果!)
|
|
8、lua 对象
lua 本身没有类功能,它的类功能是通过元表来实现的。类的函数调用通过 obj:function 方式,但类的成员赋值又是通过 obj.var 方式来实现的。
lua 中面向对象实现探索-原文、Lua中的面向对象
一、首先要了解一下.
与:
在表员函数中的应用:
|
|
二、coco2d-x coco2d-x 游戏引擎官方给出的 class 实现(官方):
待续……
- 优点:
- 缺点:
|
|
|
|
三、云风(吴云洋)大佬给出的 class 实现(网址):
待续……
- 优点:
- 缺点:
|
|
9、lua 协程
线程(thread /θred/):一个 CPU 同一时刻只能运行一段代码,但利用线程技术实现表面上看多个线程为同时执行,表象上实现并发技术,它由操作系统后台根据相应算法以隐性的方式进行切换调度。
协程(coroutine /‘kəʊruːˌtiːn/):协程的一段代码完全由主程序触发才运行,运行后再通知主程序;下一段代码以相同规则运行及通知,如此类推运行多段的代码。如果主程序根据自已的应用要求以显性的方式切换调度多个协程多段代码运行,就相当于实现了多协程并发运行。这种方式的协程以固定的调度方式并发运行,而线程则是以不确定(随机)的调度方式并发运行!
关于协程参考网文:Lua中的协程Coroutine
协程函数 |
功能 |
---|---|
coroutine.create() | 将某函数创建为一个协程 |
coroutine.resume() | 主程序触发协程运行一段代码 |
coroutine.yield() | 协程运行一段代码后通知主程序 |
coroutine.status() | 查看指定协程的状态:dead(死亡),suspended(挂起),running(运行) |
coroutine.running() | 判断当前代码是否由主程序运行:true(主程序运行),false(协程运行) |
coroutine.wrap () | 同coroutine.create() ,但其返回是一个操作函数来代替coroutine.resume() 的使用,它并不是在保护模式下执行的,若执行崩溃会直接向外抛出 |
协程的创建、触发与通知相关执行逻辑及参数传递:
注:status 值主要为 true、false(出错)
|
|
10、lua 之 table 库
一、操作函数:
说明一、关于table.xxxx()
的操作,要求表中元素不应有nil
的〖组员〗存在,否则会出错!
|
|
二、应用例子:
说明二、所有的table.xxxx()
函数只针对〖组员〗的操作,但不会影响也不受【表员】影响!
|
|
说明三、关于我对【表员】和〖组员〗的定义:有或无《键名》的元素都称为【表员】,没有《键名》的元素称为〖组员〗。关于数组与表区别:数组其实就是一个有序的表。两个重要迭代函数如下:
|
|
11、lua 之 string 库
一、基本语法:
说明一、字符串语法包括""
''
[[]]
,其中[[]]
中书写的特殊字符不需要转义。
|
|
二、操作函数:
说明二、字符操作包括 转换、查找、截取、替换、格式化。其中string.find()
和string.match()
两函数会返回nil
。
|
|
──点击展开例子──
|
|
|
|
|
|
|
|
|
|
说明三、对于使用[[]]
书写的字符串、或者通过文件方式读取的内容,lua 已自动为我们加入了转义符,所以无需关心特殊字符是否要转义。
特殊字符 |
字符 |
---|---|
\\ |
代表一个反斜线字符:\ (可见符) |
\' |
代表一个单引号字符:’ (可见符) |
\" |
代表一个双引号字符:" (可见符) |
\a | 响铃 |
\b | 退格 |
\f | 换页 |
\n | 换行 |
\r | 回车 |
\t | 水平制表(HT)(跳到下一个TAB位置) |
\v | 垂直制表(VT) |
\0 | 空字符 |
\ddd | 3 位八进制数所代表的任意字符(如:\777 ) |
\xhh | 2 位十六进制所代表的任意字符(如:\xF5 ) |
说明四、关于通配字符串,在普通字符串基本上,增加通配符(如:%a、%c 等)和 增多 12 个转义符(如:%%
、%-
等)规则。特别说明:匹配规则有 70% 类同正则表达式,更多知识请移步《正则表达式语法》!
通配符 |
含义 (下面改大写表示非,例如:%A 表示非字母的字符) |
---|---|
%( %) %[ %] %^ %$ %* %+ %? %- %. %% |
匹配中一些特殊字符需要用%来转义,主要为 12 个特殊字符:( ) [ ] ^ $ * + ? - . % |
%a | 与任何字母配对 |
%u | 与任何大写字母配对 |
%l | 与任何小写字母配对 |
%d | 与任何数字配对 |
%w | 与任何字母 / 数字配对 |
%x | 与任何十六进制数配对 |
%p | 与任何标点符配对(包括:( ) [ ] % $ ^ . ? * + - ) |
%s | 与任何空白符配对(例如:空格)(注意包括Tab键 ) |
%c | 与任何控制符配对(例如:\n)(注意包括Tab键 ) |
%z | 与任何代表 0 的字符配对 |
%bxy | 这里的 x 和 y 是两个明确的字符。 1、当 x ≤ y 表示起始符为 x 与 结束字符为 y 的字符串以最少个优先匹配; 2、当 x > y 表示起始符为 y 与 结束字符为 x 的字符串以最多个优先匹配。 3、补充:x y 匹配的中间可以有标点符 |
[字符类] | 与任何有包含在 [ ] 中的字符配对,即可以自定义字符类。例如 %x 其实就是 [0-9a-fA-F] |
[^字符类] | 与任何不包含在 [ ] 中的字符配对,即可以自定义字符类。 |
( ) | 用小括号括起一个子模式,这些子模式被称为捕获物。例如:(a*(.)%w(%s*)) ,%1 代表第一个捕获物a*(.)%w(%s*) ,%2 代表第二个捕获物. ,%3 代表第三个捕获物%s* |
^ | 以指定字符为【开头】(例如:^[%s]+ 表示有空格开头的字符串) |
$ | 以指定字符为【结尾】(例如:[%s]+$ 表示有空格结尾的字符串),同时也用来表示系统变量(例如:$HOME 为用户家目录系统变量) |
* 修饰符 | 匹配前面一个通配符n~0 个(从左到右优先匹配最多个,否则最后匹配 0 个)典型应用:"%s*" 匹配空白 或 “.” 任意字符。例如:"%(%s%)" 括号间空或多个空白(如:空格) |
+ 修饰符 | 匹配前面一个通配符n~1 个(从左到右优先匹配最多个,否则最后匹配 1 个)普通例子:"%a+" 匹配连接多个字母 |
? 修饰符 | 匹配前面一个通配符1~0 个(从左到右优先匹配 1 个,否则最后匹配 0 个)典型应用:"%s?" 匹配空白 或 “.?” 任意字符。例如:"%(%s?%)" 括号间空或一个空白(如:空格) |
- 修饰符 | 匹配前面一个通配符0~n 个(从左到右优先匹配 0 个,否则尽量匹配最少个)典型应用:"%s-" 匹配空白 或 “.-” 任意字符。例如:"%(%s-%)" 括号间空或多个空白(如:空格) |
. | 与任何字符配对(特别,不需要 % 转义符) |
说明五、关于格式化字符串,在普通字符串基础上,增加格式化符(如:%d、%f 等)和 增多 1 个转义符(即:%%
)规则。
格式化符 |
含义 |
---|---|
%% |
格式化中特殊字符“%”需要用% 来转义 |
%c | 接受一个数字, 并将其转化为ASCII码表中对应的字符 |
%d, %i | 接受一个数字并将其转化为有符号的整数格式 |
%o | 接受一个数字并将其转化为八进制数格式 |
%u | 接受一个数字并将其转化为无符号整数格式 |
%x | 接受一个数字并将其转化为十六进制数格式, 使用小写字母 |
%X | 接受一个数字并将其转化为十六进制数格式, 使用大写字母 |
%e | 接受一个数字并将其转化为科学记数法格式, 使用小写字母e |
%E | 接受一个数字并将其转化为科学记数法格式, 使用大写字母E |
%f | 接受一个数字并将其转化为浮点数格式 |
%g(%G) | 接受一个数字并将其转化为%e(%E, 对应%G)及%f中较短的一种格式 |
%q | 接受一个字符串并将其转化为可安全被Lua编译器读入的格式 |
%s | 接受一个字符串并按照给定的参数格式化该字符串 |
%2x | 输出2位十六进制整数(小写)…. |
%2X | 输出2位十六进制整数(大写)…. |
%+d | 让正数显示正号(默认情况下只有负数显示符号) |
%2d | 输出2位有符号十进整数, 不足2位时[前面]补空格(即:右对齐) ….其它数据格式类同 |
%-2d | 输出2位有符号十进整数, 不足2位时[后面]补空格(即:左对齐) ….其它数据格式类同 |
%02d | 输出2位有符号十进整数, 不足2位时[自动]补0 ……………..其它数据格式类同 |
%8.3f | 输出宽度为8(包含小数点),小数点后面是三位。 12.34 → " 12.340" |
%08.03f | 输出宽度为8(包含小数点),小数点后面是三位。 12.34 → “0012.340” |
%-5.3s | 输出宽度为5位字符(左对齐+右边补空格)来显示截取的3位字符。 |
参考网文:Lua 之 string 库、Lua 模式匹配、Lua 正则表达式匹配、Lua 字符串处理
12、lua 之 io 库
一、知识要点:
lua 对文件读操作,可以任意移动光标读取内容;但对文件写操作,只能以覆盖或追加方式写入内容,简单说就是不能直接编辑文件内容。问题来了,如何改写文件内容?【方法一】:读取一行文件内容,再写入到另一空白文件,如果中途要改写内容,则在写入前先修改缓冲内容再写入,最后所有内容写入后替换原文件(名)。【方法二】:将文件读到数组中,每行为一组员,在读/写过程中修改内容或全部读完后再修改内容,最后以覆盖方式写入文件,要求文件较小或内存足够大。估计文件编辑工具应该都是使用方法二来实现文本编辑功能。
二、操作函数:
|
|
──点击展开例子──
一、简单模式(simple model)读写操作函数无须指出句柄:
|
|
二、完全模式(complete model)使用句柄对文件进行操作:
|
|
说明一、io.open(file, [“mode”]) 参数:
参数 |
说明 |
---|---|
"r" |
以只读+存在方式打开文件,该文件必须存在,否则返回nil 。(默认的打开方式)(也常用于判断文件是否存在) |
"w" |
以只写+清空方式打开文件,若文件不存在则建立该文件(注:写光标不可移动) |
"a" |
以只写+追加方式打开文件,若文件不存在则建立该文件(注:写光标不可移动) |
"r+" |
以读写+覆盖方式打开文件,该文件必须存在,否则返回nil 。(注:写光标可以用seek 移动) |
"w+" |
以读写+清空方式打开文件,若文件不存在则建立该文件(注:写光标不可移动) |
"a+" |
以读写+追加方式打开文件,若文件不存在则建立该文件(注:写光标不可移动) |
补充 | 1. 除追加方式写光标在文件末尾外,其它方式的读写光标都默认在文件开头处。 2. "r" "r+" 必须要判断文件有存在后才可操作,否则运行会出错!3. 关于覆盖方式,如果新写入的内容少于旧内容,会残留一些旧内容在尾部! |
说明二、file:read([“mode”])、io.read([“mode”]) 参数:
参数 |
说明 |
---|---|
"*l" |
读出当前光标到行尾的内容,之后光标跳至下一行首(默认参数,可以不写 ) |
"*a" |
读出当前光标到最后一行的内容(再"*a"模式读就会返回空白 ,非nil ) |
"*n" |
读出当前光标为连续数字的内容及光标移到数字后一个字符(不会跳过回车换行符),否则返回nil 并且光标右移一位 |
数字 |
读出当前光标及之后共 n 个字符(其回车符+换行符共算两个字符),光标跳至 n 个字符之后 |
补充 | 只要光标在文件末尾,再读就会返回nil (但"*a"模式读返回空 除外) |
说明三、file:seek([“mode”, n]) 参数:
参数 |
说明 |
---|---|
"cur", n |
从当前位置开始,n 可正负数,表示光标移到前或后的第n 个字符处(n 可以为 0) |
"set", n |
从文件前头开始,n 须为正数,表示光标移到文件前头开始的第n 个字符处(n ≥ 0) |
"end", n |
从文件末尾开始,n 须为负数,表示光标移到文件末尾开始的第n 个字符处(n ≤ 0) |
13、lua 之 os 库
一、操作函数:
说明一、lua 提供了简单的跟操作系统有关的功能操作,还提供了直接运行系统命令,可扩展其应用功能。
|
|
──点击展开例子──
|
|
|
|
|
|
说明二、关于日期时间显示方式,可以通过格式化参数制定显示格式。
格式 | 说明 |
---|---|
%a | 星期简写,如:Wed |
%A | 星期全称,如:Wednesday |
%b | 月份简写,如:Sep |
%B | 月份全称,如:September |
%c | 日期和时间,如:01/05/22 13:43:08 |
%d | 一个月中的第几天,01-31 |
%H | 24小时制中的小时数,00-23 |
%I | 12小时制中的小时数,01-12 |
%j | 一年中的第几天,001-366 |
%M | 分钟数,00-59 |
%m | 月份数,01-12 |
%p | 上午(am)或下午(pm) |
%S | 秒数,00-59 |
%w | 一星期中的第几天,0-6 |
%x | 日期,如:09/16/22 |
%X | 时间,如:13:47:20 |
%y | 两位数的年份,如:22 |
%Y | 完整的年份,如:2022 |
%% | 字符% |
参考网文:Lua 之 os 库
14、lua 之 math 库
一、操作函数:
注意:使用math.random
之前要调用math.randomseed(os.time())
设置随机数种子一次(当然中途可以多次修改随机数种子),否则得不出你想要的结果!
公式 | 公式描述 | 计算例子 | 计算结果 |
---|---|---|---|
pi | 圆周率常量 | print(math.pi) | 3.1415926535898 |
abs | 取绝对值 | math.abs(-15) | 15 |
ceil | 向上取整 | math.ceil(5.8) | 6 |
floor | 向下取整 | math.floor(5.6) | 5 |
max | 取参数最大值 | math.max(2.71,100,-98,23) | 100 |
min | 取参数最小值 | math.min(2.71,100,-98,23) | -98 |
modf | 取整数和小数部分 | math.modf(15.98) | 15 98 |
randomseed | 设置随机数种子 | math.randomseed(os.time()) | 在使用math.random 函数之前必用本函数设置随机数种子 |
random | 获取随机数 | math.random(1,100) math.random(100) |
获取1-100的随机数 |
fmod(mod) | 取模运算 | math.fmod(14,5) | 4 |
sin | 正弦函数 | math.sin(math.rad(30)) | 0.5 |
cos | 余弦函数 | math.cos(0.5) | 0.87758256 |
tan | 正切函数 | math.tan(0.5) | 0.5463024 |
asin | 反正弦函数 | math.asin(0.5) | 0.52359877 |
acos | 反余弦函数 | math.acos(0.5) | 1.04719755 |
atan | 反正切函数 | math.atan(0.5) | 0.463647609 |
atan2 | x/y的反正切值 | math.atan2(90.0,45.0) | 1.10714871 |
sinh | 双曲线正弦函数 | math.sinh(0.5) | 0.5210953 |
cosh | 双曲线余弦函数 | math.cosh(0.5) | 1.276259652 |
tanh | 双曲线正切函数 | math.tanh(0.5) | 0.46211715 |
deg | 弧度转角度 | math.deg(math.pi) | 180 |
rad | 角度转弧度 | math.rad(180) | 3.14159265358 |
frexp | 分解v=x*(2的n次方) | math.frexp(10.0) | 0.625 4 |
ldexp | 计算v*(2的n次方) | math.ldexp(10.0,3) | 80=10*(2^3) |
exp | 计算以e的x次方 | math.exp(2) | 2.718281828 |
pow | 计算以x的y次方 | math.pow(2,5) | 32 |
sqrt | 开平方 | math.sqrt(16) | 4 |
log10 | 计算以10为基数的对数 | math.log10(100) | 2 |
log | 计算一个数的自然对数 | math.log(2.71) | 0.9969 |
15、lua 调试
一、操作函数:
|
|
二、应用例子:
|
|
|
|
待续……
|
|
16、lua 垃圾回收
待续……
Lua 数据库
待续……
Lua 应用
待续……