一、注释
1-1、单行注释
1-2、多行注释
标准的多行注释如下
但是建议使用如下注释
因为这样只要在第一个注释中加多一个 - 即可打开被注释的代码
因为 ---[[ --]] 这样的格式不满足多行注释,所以被解释为各自一行注释,所以最后一行需要多写两个 --
二、标识符
1. 最好不要使用下划线加大写字母的标示符,因为 Lua 的保留字也是这样的,避免冲突。
2. Lua 是一个区分大小写的编程语言,所以 and 是保留字,但 And 和 AND 却可用。
三、全局变量
1. 在默认情况下,变量总是认为是全局的。
2. 全局变量不需要声明,给一个变量赋值后即创建了这个全局变量,访问一个没有初始化的全局变量也不会出错,只不过得到的结果是:nil。
3.通过将变量赋值为 nil,进行删除一个变量,Lua 会进行回收该变量所占用的内存
当且仅当一个变量不等于 nil 时,这个变量即存在。
四、数据类型
Lua 是一个动态类型语言,不存在类型定义,值带有自身的类型信息。
4-1、类型
4-2、获取类型
通过 type 获取具体的类型,返回的是字符串
五、作用域
1. 全部直接申明变量均为全局变量
2. 局部变量需要使用 local 进行声明
应该尽可能的使用局部变量,有三个好处:
1. 避免命名冲突。
2. 访问局部变量的速度比全局变量更快。
3. 垃圾收集器能够更快的释放无用局部变量,因为局部变量随着其所在的作用域结束而消失。
举个例子:
局部变量的生效范围限于代码块内部,代码块指的是:
1. 控制结构主体
2. 函数主体
3. 代码段(变量被声明时所在的文件或字符串)
5-1、在交互模式中作用域
在交互模式中,每一行代码就是一个代码段(除非不是一条完整的命令)
以上面的代码为例,一旦输入示例的第二行(local i = 1), Lua 语言解释器就会直接运行他并在下一行开始一个新的代码段。这样,局部的声明就超出了原来的作用范围。
5-2、自定一个作用域 do-end
很多时候我们在一个代码段中(例如控制语句,函数体内),自然会有一个作用域,但是如果在一串连续的代码中,想增加一个作用域,则使用 do-end。
可以通过 do-end 声明一个作用域,这样 local 的变量一旦出了 do-end 就作废了
5-3、全局变量的检查
对于全局变量和局部变量,其实最好的做法是使用前先声明,这样表明自己想要的变量的定位。
可以借助 strict.lua 检查全局变量,如果试图在一个函数中对不存在的全局变量赋值或者使用不存在的全局变量,则会抛出异常
结果如下,因为 age 没有声明,所以报错了。
5-4、全局变量转局部变量
将全局变量转为局部量的好处:
1. 提高访问速度
2. 隔离局部的改变影响到全局(动态替换时很有用)
六、循环语句
条件表达式 condition 的结果可以是任意值 ,所有 false 和 nil 会被当作 false,其余会被当作 true(包括数值 0 和空字符串)
6-1、while 循环
6-2、for 循环
6-2-1、数值型 for
var 从 exp1 变化到 exp2 之前,会先执行一次 "执行体”,然后以 exp3 为步长增加到 var,exp3 是可选的,如果不指定,默认为 1。 如果不想有上限可以用 math.huge(数值最大值)作为上限。
值得注意
1. 循环开始前,三个表达式(exp1,exp2,exp3)都会运行一次
2. 控制变量是被 for 语句自动声明的局部变量,且其作用范围仅限于循环体内
6-2-2、泛型 for
类似 java 中的 foreach 语句,使用 ipairs
i 是数组索引值,v 是对应索引的数组元素值
pairs 与 ipairs 区别
· pairs 能迭代所有键值对。
· ipairs 可以想象成 int + pairs,只会迭代键为数字的键值对,而且在遇到 nil 时就停住。
6-3、repeat-until 循环
相当于 kotlin\java 中的 do-while ,至少会运行一次循环体,直到循环体条件为真时结束。
循环体内声明的局部变量的作用域包括测试条件
七、if 语句
Lua 中不支持 switch 语句,所以只能用 if-else
值得注意
Lua 将所有不是 false 和 nil 的值当作真(包括 0 和空字符串都会当作真)
八、goto
声明标签格式 ::name::, 在使用的地方调用 goto name
在 lua 中没有 continue 语句,所以如果需要的话,可以考虑使用 goto 语句实现
九、关系符号
不等于使用 ~= , 不是 !=
非操作用 not,相当于 !