Lua语法基础
Lua令牌标记
Lua程序由各种标记组成,标记可是关键字,标识符,常量,字符串或符号.
1 | io.write("Hello World, from",_VERSION,"\n") |
注释
Lua的注释以—开头结尾
1 | --- 这里是注释 |
Lua变量
根据变量范围,Lua变量有三种类型:
- 全局变量
所有变量被声明为全局变量,除非明确声明为局域变量 - 局域变量
当变量指定类型为local时,其单位受函数范围的限制 - 表字段
这是一种特殊类型的变量,可以保存nil之外的任何对象
Lua变量声明和定义
变量定义告诉解释器为变量创建存储的位置和数量,变量具有可选类型,并且包含该类型一个活多个变量的列表(吐槽: 要跟python列表弄混了)
1 | type variable_list |
这里,type是可选的本地或全局类型.而variable_list可以包含一个或多个由逗号分隔的标识符名称.
1 | local i,j |
变量可以在声明时初始化:
1 | local a, b = 0, 1 |
Lua可以像py那样平行赋值
1 | a = 0 |
Lua数据类型
Lua是一种动态类型语言,即 变量没有类型,只有值有类型
数据类型:
值类型 | 描述 |
---|---|
nil | 用于区分值与某些数据或没有数据(类似js里的null或py里的None?) |
boolean | boolean |
number | 表示实数(双精度浮点)数字 |
string | 表示字符数组 |
function | 表示用C语言或Lua编写的方法 |
userdata | 表示任意C语言数据 |
thread | 表示独立的执行线程,用于实现协同程序 |
table | 表示普通数组,符号表,集合,记录,图形,树等,并实现关联数组.它可以保存任何nil以外的值 |
type函数
1 | print(type(0)) |
默认情况下,在分配值或初始化之前,所有变量都指向nil.
Lua字符串
Lua字符串可以用三种形式初始化
- 单引号之间的字符串
1 | 'lua' |
- 双引号之间的字符串
1 | "lua" |
- [[和]]之间的字符串
1 | [[lua hhhhhhhh |
[[和]]之间的字符串可以换行,类似py的三个引号的字符串
字符串操作
方法 | 作用 |
---|---|
string.upper(“Some String”) | 返回参数的大写表示 |
string.lower(“Some String”) | 返回参数的小写表示 |
string.gsub(“Some String”, “S”, “啊”) | 类似py的replace |
string.find(“Some String”, “S”) | 返回mainStr中,findStr的起始位置和结束位置. 我佛辣,这个lua怎么索引都是从1开始的 |
string.reverse(“Some String”) | 返回参数的倒序字符串 |
string.format(“Some String %d %s”,12,“ccc”) | 格式化字符串 |
string.char(“Some String”)和string.byte(“Some String”) | 不解释 |
string.len(“Some String”) | 返回长度 ntm不是有#运算符了么??? |
string.rep(“Some String”,2) | 返回参数字符串重复n次后的结果 |
… | …运算链接两个字符串 |
Lua数组
1 | array = {"a", "b"} |
Lua数组的索引是从1开始的…
Lua数组接受负数和0索引
1 | array = {} |
Lua运算符
算术运算符
以下是Lua语言支持的所有算术运算符.假设变量A=10, B=20
运算符 | 描述 | 示例 |
---|---|---|
+ | 两相加操作数 | A + B : 30 |
- | 第一个减去第二个操作数 | A - B : -10 |
* | 将两个操作数相乘 | A * B : 200 |
/ | 第一个操作数除以第二个操作数 | A / B : 2 |
% | 模数运算符,去整除后的余数 | B % A : 0 |
^ | 指数运算符,取指数幂值 | A ^ 2 : 100 |
- | 一元运算符,充当否定 | -A : -10 |
关系运算符
关系运算符
==, >, <, >=, <=等,跟其他语言差不多.
注意不等于是~=,而非!=
逻辑运算符
and, or, not,和python用起来差不多,只是lua的not只能用于处理布尔值,没有像python那样的a not == b,只能not a == b
杂项运算符
运算符 | 描述 | 示例 |
---|---|---|
… | 连接两个字符串.惊了,连接字符串不能用+的,只能用这个… | “111”…“233” : 111233 |
# | 返回字符串或表长度的一元运算符 | #“abc” : 3 |
Lua的循环
while循环
1 | while(condition) |
1 | a = 10 |
(惊了,lua不支持a += 1这种)
for循环
1 | for init, max/min value, increment |
上面代码中:
- init首先执行,只执行一次,此步骤允许声明和初始化任何循环控制变量(什么任何?)
- 接下来执行max/min.这是循环继续执行的最大值或最小值.它在内部创建条件检查,以比较初始值和最大/最小值
- 在执行for循环体之后,控制流会跳回increment/decrement语句.此语句用于更新循环控制变量.
- 再次评估条件.如果为真,则循环执行并且过程自身重复(循环体,然后递增步骤,然后再次调节).条件变为false后,for循环终止
1 | for i = 1, 10, 1 |
…这语法…我佛辣
顺便试了一下,lua用不着游标卡尺…
repeat…until循环
与在顶部测试循环条件的for和while不同,lua的repeat…until循环在底部检查循环的条件.
repeat…until循环类似while循环,但是repeat…until循环保证至少执行一次.
1 | x = 100 |
循环控制声明
有break,好像没有continue
Lua流程控制
1 | if(boolean) |
1 | if(boolean) |
1 | if(boolean) |
注意: elseif后面需要then,else后面没有
Lua函数
Lua中编程语言中的方法定义一般形式如下:
1 | optional_function_scope function function_name( argument1, argument2, argument3........, |
- 可选函数范围
使用local关键字来限制函数范围或者忽略该部分,使之成为一个全局函数 - 函数名称
函数的实体名称 - 参数
- 函数主体
- 返回
示例:max函数
1 | function max(num1, num2) |
可变参数函数
使用…作为参数在lua中创建具有可变参数的函数.
1 | function average(...) |
Lua迭代器
迭代器泛型
迭代器泛型提供集合中每个元素的键值对.
1 | array = { "a", "b" } |
上面这个例子使用了Lua提供的默认的ipairs迭代器
在Lua中,使用函数来表示迭代器.基于这些迭代器函数中的状态维护,有两种主要类型:
无状态迭代器
这类迭代器不会保留任何状态.
Lua表
表是lua中唯一可用的数据结构.使用表可用创建不同的类型,比如数组和字典.
Lua使用关联数组,不仅可用数字编制索引,还可以使用除nil之外的字符串编制索引.
1 | a = {} |
表示和用法
表称为对象,它既不是值也不是变量.Lua是哟构造函数{}来创建一个空表.
表操作
表连接
使用concat函数连接表
table.concat (table [, sep [, i [, j]]])
1 | fruits = { "bbb", "ccc", "ddd" } |
插入和删除
table.insert (table, [pos,] value)
table.remove (table [, pos])
1 | arr = { "bbb", "ccc", "ddd" } |
排序
1 | arr = { "e", "b", "d", "c", "a" } |