--[[
当条件满足时,进入循环体,执行一次内部代码
while(条件)
{
循环体
}
]]-- 执行3次循环,并在内部输入变量的值-- 分支用then,循环用dolocal num =1while num <4-- 当条件满足时,进入循环体do-- local修饰num,num是局部变量,num的作用域是整个当前文件,所以while内部可以取到num变量的值print(num)
num = num +1end
--[[
先执行一次do结构中的代码
判定while中的条件是否满足
若条件满足,再次执行do结构中的代码
若条件不满足,结束循环
do
{
循环体
}
while(条件)
]]local num =1repeatprint(num)
num = num +1until num >3-- 直到条件满足时,结束循环(和do-while相反)--[[
do
{
if(条件1)
{
逻辑代码
break
}
if(条件2)
{
逻辑代码
break
}
}
while(false)
]]-- Lua老司机-- Lua中没有continue,无法跳过当前这次循环repeatiffalsethenprint("执行第一个分支")breakendiftruethenprint("执行第二个分支")breakendiftruethenprint("执行第三个分支")enduntiltrue
-- for循环,循环指定的次数--[[
for(int i = 0; i < 10; i++)
{
}
]]-- 参数1:计数变量的初始值-- 参数2:增长到多少-- 参数3:增长步长,默认是1(i每次递增几)for i =1,10,1doprint(i)endprint("----------------")-- 递减for i =9,1,-1doprint(i)endprint("----------------")local data ={"a","b","c","d","e"}for i =1,#data,1doprint(data[i])endprint("----------------")for i =#data,1,-1doprint(data[i])end
对比
分支结构
C#
Lua
if语句
代码体部分用一个{ }进行包裹
用then和end代替{ }进行包裹
if…else…语句
if和else下方都跟着一个代码体,每个代码体都需要用{ }包裹
只有在if语句下方才会出现then,整个if代码的结尾处用end
if…else if…语句
else if两个单词之间是有空格的
elseif两个单词相连且没有空格
switch…case…语句
有
没有
循环结构
C#
Lua
while语句
代码体部分用{ }包裹
代码体部分用do和end包裹
do…while语句
有
无,但有类似的语句;布尔表达式不成立的时候才会继续循环
for语句
参数之间用;分号分割
参数之间用,逗号分割
关键字
有break和continue
只有break
五.数组
数组演示
-- 数组实际上就是表,现阶段只考虑数字索引-- C# string[] data = new string[20];local data ={}-- 下标是从1下标开始-- 内部存储类型可以混合-- 索引可以是负数-- 虽然下标是从1开始,但是可以有0索引-- 索引可以有间隔-- 没有提供索引的数据,下标是从1开始-- [索引] = 值方式,可以指定数据的下标
data ={"abc",123,[-1]=100,[0]=true,[4]=233}-- 通过下标增加值
data[-2]="def"print(data[1])print(data[2])print(data[-2])print(data[-1])print(data[0])print(data[4])-- 获取table长度-- 计算table是从1下标开始的,根据连续索引计数,中间有断裂,则计数结束-- !!!这种计数不靠谱!!!print("长度是:"..#data)--getn获取长度for i=1,table.getn(data ),1doprint(data[i])end-- 通过下标修改值,也可以修改类型
data[0]=3.14print(data[0])-- 多维tablelocal multi ={{"abc",123},{true,{"hehe"}}}print(multi[2][1])print(multi[2][2][1])
对比
数组
C#
Lua
长度
长度是固定的
长度不固定,可以给后续的索引位置继续赋值
下标
从0开始
从1开始
类型
只能存储一种类型
可以存储多种类型
声明数组
string[] data={"baidu","QQ","JD"};
data={"baidu","QQ","JD"}
数组长度
数组本身的属性data.Length
需要用到table中的方法table.getn(data)
六.函数
函数演示
-- 解释型语言代码都是自上而下进行解析,所以函数需要先定义,才可以调用-- 编译型语言-- 编写阶段:不分声明,执行先后-- 运行阶段:编译器会将声明编译在调用之前,声明先于调用-- 解释型语言-- 编写阶段:声明写在调用之前-- 运行阶段:声明在调用之前运行-- 调用失败-- func1()functionfunc1()print("这是func1")endfunc1()------------------------------------------- function是存储在变量中的-- 可以理解为C#的委托local func2 =function()print("这是func2")endfunc2()-----------------------------------------local func3 =function(a, b)print("这是func3输出:".. a + b)endfunc3(1,3)-- 参数的数量可以多于函数提供的参数,不能少于参数数量func3(1,3,7)------------------------------------------- 可变参数(无固定数量)-- 无论提供多少参数,全部进行相加local func4 =function(...)-- 无固定参数,需要转换为table-- arg的作用域是当前函数体local arg ={...}local total =0-- 下划线将下标的值丢弃了for _, v inpairs(arg)do
total = total + v
endprint("这是func4输出:".. total)endfunc4(1,3)func4(1,3,7)func4(1,1,1,1)-----------------------------------------functionfunc5()-- 多个返回值之间用逗号分隔return99,999end-- local 修饰两个变量,表示他们两个作用域是当前文件local num1, num2 =func5()print(num1)print(num2)
对比
函数
C#
Lua
语法格式
static void Hello(){Console.WriteLine("Monkey");}
function Hello( )print("Monkey")end
代码顺序
编译型语言,代码顺序无所谓
解析型语言,必须先声明,然后才可以调用
函数作为参数传递
适用委托实现
没有委托的概念,真的可以直接当成参数
七.作用域与字符串
作用域演示
--全局变量.
name ="Monkey"
age =100--局部函数.privatelocalfunctionHello()--全局变量.local webName ="得到APP"print(webName .."方法内的")print(name, age)end--print(name)--print(age)--print(name, age)Hello()print(webName)--\转义符
str4 ="My \\Name \"Is\' \nMonkey!"--print(str4)