菜狗教程 —— Lua 篇 01
Hello World
安装完成后,使用lua或者lua -i进入交互式编程模式,或者使用lua <file_name>执行脚本文件。
变量
Lua 是动态类型语言,变量没有固定类型。变量默认是全局的,局部变量需要使用关键字local显式声明。
变量有8种类型:
- nil
- boolean
- number
- string
- function
- userdata
- thread
- table
可以使用 type() 函数输出任何变量的类型,输出的类型为 string,内容是上面8种之中的一个。
nil 表示没有任何值,也就是「空」。所有变量在未赋值之前都是 nil,将 nil 赋值给变量相当于删除。nil 可以用来判断是否相等(nil==nil = true),也可以将 nil 用作判断条件,此时相当于 false。
boolean 只有 true 和 false。Lua 中只有 nil 和 false 为假,其他都是真(包括数字 0)。
number 类型用于表示所有的数字,约等于 double。
string 可以用双引号或单引号表示,类似 python。也可以用[[]]包起来以不需转义的方式保留内部格式,相当于 Kotlin 的三引号。
string 类型可以直接进行数学运算,但如果内容无法转换成 number,就会报错。
string 拼接使用 .. 运算符,# 加 string 可以获得 string 的长度。更多 string 操作后面再单独说。
table 是 Lua 唯一的集合,使用 {} 创建。用法非常灵活,可以当成 Array 或者 Map 使用,也可以有更神奇的用法(比如模拟继承和多态等面向对象编程的能力)。
table 不指定 key 的时候相当于 Array,但是自动生成的 index 是从 1 开始的。指定 key 的时候相当于 Map。
table 索引可以用 [],将对应 index 或者 key 的 value 赋值成 nil 表示删除。
function 在 Lua 中可以当做变量使用。其他关于 function 的内容单独展开写。
thread 在 Lua 中实际上是一种协程,详情后面展开。
userdata 表示一种自定义数据,通常来源于脚本外部(比如 C++ 的一个指针),可以按照一定方式使用。
运算符
Lua 的大部分运算符是常规的算数运算符,就有几个是需要特殊注意一下的:
| 运算符 | 功能 |
|---|---|
| ~= | 不等于 |
| # | 取 string 或 table 的长度 |
| and | 逻辑与 |
| or | 逻辑或 |
| not | 逻辑非 |
流程控制
分支:
- if - then - else - end
循环:
- while - do - end
- repeat - until
- for i=exp1,exp2,exp3 - do - end
- for k,v in pairs(table) - do - end
Lua 不使用花括号划定作用域,注意不要遗漏 then、do 和 end。
pairs 是一个内置函数,可以为 table 提供一个迭代器。
函数
function 也是变量,遵循默认全局,加 local 变局部的规则。
function 的范围从关键字 function 开始,到 end 结束,同样不需要花括号。
Lua 中 function 可以接收任意数量参数,返回任意数量的值。参数列表随函数一起定义,返回值则不需要在定义中声明。参数列表也可以使用 ... 表示可变长度。
字符串
string 的基本用法在变量中已经提到过,但字符串处理是比较常用的内容,这里补充一些 string 的内置函数。
Lua 提供了一些内置函数来处理 string:
| 函数名 | 功能 |
|---|---|
| string.upper(arg) | 变大写字母 |
| string.lower(arg) | 变小写字母 |
| string.gsub(inputStr, findStr, replaceStr, [replaceCount]) | 找到并替换(指定次数) |
| string.find(inputStr, findStr, [init, [end]]) | 找打并返回位置,两个返回值分别是 start end |
| string.reverse(arg) | 反转字符串 |
| string.format(...) | 格式化输出(类似 printf) |
| string.char(args) | ASCII 数字转字符串 |
| string.byte(inputStr, [index]) | 指定字符转 ASCII |
| string.len(arg) | 计算字符串长度 |
| string.rep(arg) | 重复字符串 |
简单举几个例子,交互式编程模式也能记住之前定义的变量,很推荐初学者(指我自己)随便试试。
调试 Lua
Lua 中的注释使用 -- 标识,多行注释是结合 -- 和保留字符串格式的 [[]] 。
Lua 是用 print 函数输出日志,debug 库提供了一些能力以便更好的输出运行时信息。