一、环境搭建
初学lua,首先要做的就是搭建环境
首先下载lua,解压。
添加环境变量:
随后安装ide,我用的vscode,官网下载vscode
下载之后安装,lua debug
新建lua文件,ctrl+N(或者右上角新建)
然后ctrl+s保存文件,开始编译。
二、基本语法
基础数据类型:
基础数据类型
nil | 表示无效,在表达式中等于false,可以将一个变量赋值为nil来删掉他 |
boolean | true和false |
number | 双精度浮点数 |
string | 字符串 |
function | 函数,并且作为“第一类值”看待 |
table | “关联数组”,无固定大小,Lua主要的数据结构机制,超强 |
userdata | 表示一种由应用程序或c语言库所创建的新类型 |
thread | 线程 |
--使用--表示单行注释
a=5; --lua可用分号,也可不用
b=2.0 --声明一个变量直接赋值,变量类型根据赋值来
c="qwe"
d=false
e={} --声明一个空的table
function PrintType(x) --定义一个函数
print(type(x)) --lua自带print,type函数,type函数返回变量的类型
end --表示函数体结束
PrintType(a)
PrintType(b)
PrintType(c)
PrintType(d)
PrintType(e)
PrintType(PrintType)
print(f) --值得一提的是,当访问一个没有被定义的变量时会返回nil
定义域:
a=5 --全局变量a
do --定义一个语句块
local a=6 --局部变量a,局部变量优先级大于全局变量
print("局部变量a在语句块中的值:"..a)--..用于连接字符串
end --语句块结束
print(table.concat({"全局变量a的值:",a}))--另一种字符串连接方式,速度更快
--[[
--[[多行注释]]--
将上面那句语句展开
local temtable={"全局变量a的值:",a} --初始化一个table,并赋值
print(table.concat(tamtable))--table的内置函数,不会改变原table结构
]]--
function AddOne(x)
local b=1
return x+b
end
print(table.concat({"在函数中定义的局部变量b:",b}))
流程控制:
lua中有if、while、for及repeat循环
代码演示:
--假设现在做1到10的累加
--for循环
--[[
i从exp1变化到exp2,变化到exp2时停止循环
每次exp1递增exp3,并执行循环体,若不写exp3,则默认递进1
for i=exp1,exp2,exp3 do
循环体
end
]]--
do
local sum=0
for i = 1, 10 do
sum=sum+i --sum做累加,lua不支持sum++
end
print(table.concat({"sum的值为",sum}))
end
--while循环
do
local sum=0
local i=1
while i<=10 do --当while后的条件为真时执行循环
sum=sum+i
i=i+1
end
--[[
table.unpack,接受一个数组作为参数,并默认从下标1开始返回数组的所有元素
遇到数组下有nil,返回nil,有字母key的时候,也返回nil
local info={1,2,3,nil,5,p=6}
local a,b,c,d,e,f=table.unpack(info)
print(a,b,c,d,e,f)
输出结果:1 2 3 nil 5 nil
]]--
print(table.unpack{"sum的值为",sum})
end
--repeat循环
do
local sum,i=0,1 --lua允许多重赋值,若值的个数少于变量个数,变量被赋值为nil,多余则会被丢弃
repeat
sum=sum+i
i=i+1
until i>10 --条件为真时执行
print(table.concat({"sum的值为",sum}))
end
结果:
if语句演示:
do
local _inputnum=1
if _inputnum==1 then
print("打印了1")
elseif _inputnum==2 then
print("打印了1")
end
end
for循环还可用作迭代器:pairs 与ipairs、以及for循环遍历
代码示例
table1={1,2,100,"Hello"}
for _kay,_val in pairs(table1) do --pairs循环能遍历到table数组里面所有的key
print(_kay,_val)
end
table1={[1]=1,[2]=2,[4]=4,["Hello"]="hello"}
for _kay,_val in ipairs(table1) do --ipairs在table中一旦遇到nil就停止,table1的[3]为nil
print(_kay,_val)
end
print("table[3]="..type(table1[3])) --使用..可以连接两个字符串,但效率很低,一般不推荐
他们的效率比较:
table1={}
for i=1,100000000 do --初始化table
table.insert(table1,i) --往table1最后面插入一个数字
end
--ipairs
startTime=os.clock() --开始时间
for k,v in ipairs(table1) do
table1[k]=v
end
endTime=os.clock() --结束时间
print("ipairs的时间:",endTime-startTime)
--pairs
startTime=os.clock()
for k,v in pairs(table1) do
table1[k]=v
end
endTime=os.clock()
print("pairs的时间:",endTime-startTime)
--for
startTime=os.clock()
for i=0,#table1 do
table1[i]=i
end
endTime=os.clock()
print("for的时间:",endTime-startTime)
三次结果:
结论:for快,ipairs其次,pairs慢。
另外:for循环的条件只计算一次,即后面更改for的循环条件,也不会改变循环次数
table1={1,2,3}
for i=1,#table1 do
table.insert(table1,i)
print("table的长度:",#table1)
end