变量
1.全局变量
写在函数外部的变量,我们称之为全局变量
作用范围:从定义的那一行,一直到文件末尾
Lua 在默认的情况下,变量总认为是全局的,全局变量不需要声明,给一个变量赋值后即创建了这个全局变量
2.局部变量
写在函数内的变量,我们称之为局部变量
作用范围:从定义的那一行开始,一直到函数结束或者return
Lua可以用关键字local定义局部变量
Lua标识符用于定义一个变量,标识符由字母,数字,下划线组成,
且必须以字母或下划线_开头
注意:Lua是大小写敏感的。
数据类型
nil类型
没有被声明的变量都是nil;
Lua可以实现一次性给多个变量赋值。
eg:a,b = 1,2;
如果右边的值不够左边赋值,那没有被赋值的变量是nil
eg: a,b,c = 1,2 -----------c没有被赋值c就是nil
number类型
支持16进制:a = 0x11
支持科学记数法:a = 2e10
算数运算符
支持加减乘除符号
也支持乘幂符号:10^5
支持左移右移:print(1<<3)---表示1左移3位输出结果是8
(“<<”代表左移运算符(就相当于’shl’)。该运算符为双目运算符,结合方向为从左到右,作用是把一个整型数的所有位向左移动指定的位数,移动到左边界之外的多余二进制位会被丢弃,并从右边界移入0。)
string 字符串
可以用双引号来圈住字符串:a="adsadw"
可以用单引号来圈住字符串:b = 'asdaasd'
支持转义字符
eg:a = "dadw\ndawd"
print(a)
输出结果:dadw
dawd
如果需要使用一个多行文本可以用两个中括号就可以表示随意的一些字符
eg:c = [[asddadadad
adadadasd\da
asdada
saad]]
在Lua中连接符号不是+号而是两个点:c =a..b
eg:a = "asdw"
b = "abc"
print(a..b)-----输出结果为asdwabc
tostring()可以将数字转化成字符串:a=tostrihg(10);
tonumber()可以实现字符串转化为数字:n = tonumber("10")
如果tonumber()转换失败则n则为nil
eg:n=tonumber("abc")----若输出n,则输出的是nil
函数
语法:
function f(参数列表)
函数体
end
注意:
1.若没有返回值,则默认返回值是nil,也可以用return主动返回一个值。
2.返回值可以有多个,用逗号隔开
eg:function f(a,b,c)
return a,b,c
end
table下标
table有两种下标:
数字下标
字符串下标
table数字下标
类似与其他语言里面的数组但是唯一不同的是这个table里面它可以存储数字也可以存字符串甚至还可以存一个其他的table或者再存一个function,几乎什么都可以存用","分隔就可以了
eg:a = {1,"ac",{},function() end}
在Lua里面数组这种下标的起始值是1,就是说第一个元素它的小标就是1,第二个下标就是2,跟其他的语言不太一样,其他语言都是从0开始
在table中如果它的某一个下标它没有表达任何值的话那就是nil
eg:a = {1,"ac",{},function() end} --如果输出a[5]输出结果将会是nil
在table中我们也可以对他进行赋值操作比如a[5]是nil,如果我们对他进行赋值eg:a[5] = 123这样它就有意义了。如果输出a[5],则输出123
数组型的table他也可以用类似于字符串长度的一个#号来获取这个table的长度
eg:a = {1,"ac",{},function() end}
print(#a)
我们还可以通过Lua自带的table接口来对这个数组进行操作
插入接口:
eg:a = {1,"ac",{},function() end}
table.insert(a,b,c)
a:表示你要操作的数组
b:表示要插入的位置----例如2表示插入的元素的位置将为2
c:表示要插入的元素
删除接口:
eg:a = {1,"ac",{},function() end}
table.remove(a,b)
a:表示你要操作的数组
b:表示要删除元素的位置----例如2表示删除数组中位置为2的元素
而且table.remove()还会把移除的元素返回出来
eg:a = {1,"ac",{},function() end}
local s = table.remove(a,2);-------如果输出s,则输出的就是"ac"。
table字符串下标
用字符串来当作下标的table,写法与数组类似也是用大括号括起来,只不过我们要把下标直接写出来
eg:a={
a =1,
b ="1234",
c = function()
end,
d = 123123
[",;"] =123
}
print(a["a"])-----输出结果为1
a["a"]不太不符合命名规范
尽量这样a.a
print(a.a)
但遇到下标为[",;"]就只能这样a[",;"]
也可以直接给下标赋值
a["abc"] = "asdasd"
没有声明过的下标,那他的值一定是nil
eg: print(a["def"])----输出为nil
全局表_G
如果声明一个全局变量,那么他就会在_G这个全局表table里面
eg:a = 1
print(_G["a"])-----输出结果为1
所有全局 变量都在_G里面
实际上table是一个全局变量,这个全局变量它的类型就是table,他有一个下标叫insert,同时table是全局变量,所以他也在_G全局表里面
eg:print(_G["table"])-------打印结果为table:0x10
因为他也是table,他还有下标叫做insert,我们可以把它的下标打出来
print(_G["table"] ["insert"])------>打印出来的function:0xc1
可以看到table的下标insert它的值是一个函数。
就是我们刚才调用的table.insert这个函数
真和假
Lua 里有一种类型叫做布尔型
它的值只有true和false两种
eg:a = true
b = false
在lua也支持这些符号:>,<,>=,<=,==,~=
注意:在lua里面不等于是用~=来表示的
Lua还支持and or和not符号
and,or,not计算就是与或非和其他语言类似
优先级顺序:not>and>or
eg:a = true
b = false
print(a and b)
print(a or b)
print(not a)
输出:false
true
false
若把a与b的值改一下,把a改成nil把b改成0
a = nil ----假
b = 0 -----真(因为b不为nil或者false)
print(a and b)
print(a or b)
print(not a)
输出:nil
0
true
可以看出来Lua直接返回a和b的值
只有not返回的是纯粹的true和false。利用这个特征我们
可以用and和or来实现短路求值
print(b>10 and "yes" or "no")-----如果b>10就返回一个yes否则返回一个no
判断语句
语法:
if 判断条件 then
执行语句
elseif 判断条件 then
执行语句
else
执行语句
end
eg:if 1>10 the
print("1>10")
elseif 1<10 then
print("1<10")
else
print("no")
end
注意:在Lua里面0代表真
循环
for循环
语法:
for i = a,b,c do
执行语句
end
a:代表i的初始值
b:代表i的最终值
c:表示i以多少靠近最终值
eg:for i=10,1,-1 do
print(i)
end;
输出结果:10
9
8
......
1
注意:for循环中的i的值在程序运行途中是无法更改的。如果给i赋值,系统将默认悄悄地在for循环中在这行代码前,给你建立一个局部变量
eg:for i=10,1,-1 do
print(i)
local i = 1
i=5 -------系统将默认在这行语句前建立 local i,然后你后面调用将会用到这个i,也就是现在这行代码
end;
但可以通过break终止循环
while循环
语法:
while 条件 do
执行语句
end
eg:while n>1 do
print(n)
n =n-1
end
注意:在while中也能使用break
字符串补充说明
Lua里的string字符串类型其实和C里面的字符数组比较接近
在lua里面字符串可以包含任意的数值包括0x00
string.char()
可以将ASCII码值变成字符串
eg:s = strinng.char(0x30,0x31,0x32,0x33)
print(s)
输出结果:0123
string.byte()
可以取出字符串中的某一位
string.byte(a,b)
a:表示字符串
b:表示字符串中的位置
eg:s = strinng.char(0x30,0x31,0x32,0x33)
n = string.byte(s,2)
print(n)
输出结果:49
注意:在Lua中字符串的第一个字符的位置是1不是0
因为Lua字符串可以放任何字符所以0x00也是可以的
0在C语言内代表结束,但在Lua中0是可以存放的
eg:s = strinng.char(0x30,0x00,0x31,0x32,0x33)
n = string.byte(s,2)
print(n,#s)
输出结果:0 5
Lua的这个特性可以让我们用字符串,来安全地存储一些比如二进制流之类的数据
因为在Lua字符串里所有数据都是原原本本地存起来的不会受任何的影响