1注释:
①单行注释:两个减号是单行注释。
eg. --
②多行注释:--[[多行注释
多行注释
]]--
2.标示符:Lua标示符用于定义一个变量,函数获取其他用户定义的项。标示符以一个字母A到Z或a到z或下划线_开头后加上0个或多个字母、下划线、数字(0到9).
Lua不允许使用特殊字符如@,$和%来定义标示符。Lua是一个区分大小写的编程预言。
3.关键字:以下列出Lua的保留关键字。保留关键字不能作为常量或变量或其他用户自定义标识符。
and,break,do,else,elseif,end,false,for,function,if,in,local,nil,not,or,repeat,return,then,true,until,while.
一般约定,以下划线开头连接一串大写字母的(如_VERSIOIN)被保留用于lua内部全局变量。如_G是当前的环境变量。
4.全局变量:在默认情况下,变量总认为是全局的。全局变量不需要声明,给一个变量赋值后即创建了这个全局变量,访问一个没有初始化的全局变量也不会出错,只不过得到的结果是nil.
所以如果你想删除一个全局变量,只需要将变量赋值为nil.
5.Lua有8种基本类型,分别是string(字符串)、number(数字)、function(函数)、boolean(布尔类型)、nil(空)、thread、userdata。前面六种我们可以通过函数type进行测试,并用print输出。如下图所示:
6.nil类型:Lua中特殊的类型,它只有一个值:nil。一个全局变量没有被赋值以前默认值为nil;给全局变量赋值为nil,可以删除该变量。
7.boolean类型:两个取值false和true.在控制结构的条件中除了false和nil为假,其他值都为真。所以Lua认为0和空串都是真。
8.number类型:表示实数、整数和浮点类型的都属于number.
9.string类型:指字符的序列。Lua是8位字节,所以字符串可以包含任何数值字符。string和其他对象一样,Lua自动给进行内存分配和释放。对于字符串内含有引号的情况还可以使用转义符\来表示。
*Lua会自动在string和numbers之间自动进行类型转换。如果是数值字符串(如'10')可以通过tonumber函数进行显示转换,如果不为数值字符串那么调用此函数会返回nil。
*如果字符串遇到算术运算符,则会转换为数值进行运算。
*number类型可以通过tostring()来实现向字符串类型的转换 。eg. print(tostring(10) == "10") -->输出true--
10.运算符
1>算术运算符:二元运算符(+、*、/、^)、一元运算符:-(负值),这些运算符的操作数都是实数。
2>关系运算符:>、<、<=、>=、==、~=
*nil只和自己相等;
*Lua通过引用比较tables、userdata、functions。也就是说当且仅当两者表示同一对象时相等。
3>逻辑运算符:and or not.逻辑运算符认为false 和 nil是假(false),其他为真,0也是true.and 和 or的运算结果不是true和false,而是和它的两个操作数相关。
*and的优先级比or的优先级高
*and 如果左边为真打印右边,如果左边为假打印左边
*or如果左边为真打印左边,如果左边为假打印右边
*a?b:c如果a为真则执行b,否则执行c。用and or代替可表示为(a and b) or c
11.语句:
1>赋值语句:Lua可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会依次赋值给左边的变量。
所以我们可以通过赋值语句进行交换变量的值。
* 当变量和值的个数不一致时,Lua会以变量的个数为基础采取以下策略
①变量个数>值的个数 依次赋值,不足nil
②变量个数<值的个数 多余的值会被忽略
2>局部变量与代码块:使用local创建一个局部变量,与全局变量不同,局部变量只在被声明的那个代码块有效。
3>控制语句
①if conditionsthen
then-part
end
②ifconditions then
then-part
elseifconditions then
elseif-part
```
else
else-part
end
③循环
for i=exp1,exp2,exp3 do
loop-part
end
即范围为[exp1,exp2],步长为exp3
12.函数:function与end成对出现,并且接受可变数目的参数,参数列表使用...表示函数有可变的参数。Lua将参数放在一个叫arg的表中,可通过#arg来活得参数的个数大小。另外,Lua函数中,return可以返回多值。
13.表(table)最简单的构造函数是{},可以直接化数组,也可通过键值对进行初始化(显式设置下标,使用#打印不出长度)。
标准库中提供了集中迭代器,其中 pairs 和 ipairs 会产生两种不同的迭代器, 一个仅仅遍历数组, 一个遍历所有的值。前者可以返回nil,后者遇到nil则退出,不管后面有没有值。
测试如下:
编译结果:
恩,ok
补充几个对于理解pairs和ipairs的例子,是从菜鸟教程摘录的哇 下部分链接
pairs 和 ipairs异同
同:都是能遍历集合(表、数组)
异:ipairs 仅仅遍历值,按照索引升序遍历,索引中断停止遍历。即不能返回 nil,只能返回数字 0,如果遇到 nil 则退出。它只能遍历到集合中出现的第一个不是整数的 key。
pairs 能遍历集合的所有元素。即 pairs 可以遍历集合中所有的 key,并且除了迭代器本身以及遍历表本身还可以返回 nil。
栗子1:
local tabFiles = { [1] = "test2", [6] = "test3", [4] = "test1" } for k, v in ipairs(tabFiles) do --输出"test2",在key等于2处断开 print(k, v) end
栗子2:
local tabFiles = { [2] = "test2", [6] = "test3", [4] = "test1" } for k, v in ipairs(tabFiles) do --[[什么都没输出,为什么?因为控制变量初始值是按升序来遍历的,当key为1时,value为nil,此时便停止了遍历, 所有什么结果都没输出]]-- print(k, v) end
栗子3:
local tabFiles = { [2] = "test2", [6] = "test3", [4] = "test1" } for k, v in pairs(tabFiles) do --输出2 test2, 6 test3, 4 test1 print(k, v) end
栗子4:
local tabFiles = {"alpha", "beta", [3] = "no", ["two"] = "yes"} for i,v in ipairs(tabFiles ) do --输出前三个 备注:因为第四个key不是整数 print( tabFiles [i] ) end for i,v in pairs(tabFiles ) do --全部输出 print( tabFiles [i] ) end