Lua语句,和其他的语言类似,包括循环和控制结构。

--赋值语句
--赋值语句没有什么好说的,只是Lua可以对多个变量同时赋值,应用如下
--1、用来进行变量的交换,可以说是一个小技巧吧
local a,b = 1,2
print(a,b) -->1 2
a,b = b,a
print(a,b) -->2 1
--2、接收函数的返回值,针对函数多返回值的情况
local function f()
    return 12,23
end
local i,j = f()
print(i,j) --> 12 23

--当变量个数和值的个数不一致时,Lua会一直以变量个数为基础采取以下策略:
--a. 变量个数 > 值的个数             按变量个数补足nil
--b. 变量个数 < 值的个数             多余的值会被忽略
--local a, b, c = 0, 1
--print(a,b,c)             --> 0   1   nil
--
--local a, b = a+1, b+1, b+2     -- b+2 is ignored
--print(a,b)               --> 1   2
--
--local a, b, c = 0
--print(a,b,c)             --> 0   nil   nil

--控制语句
--if语句
local a = false
if a then
end
-- if else
if a then 

else 

end
 --if elseif else 最后一个else后边没有then
if a then

elseif a then

else

end
--今天一个同事问我Lua中有没有switch语句,注意啦,是没有的。

--while do语句
while a do
end
--repeat-until语句 一直执行循环,直到until的条件为真,这个我在使用Lua的过程中一次也没用到过
local a,b = 1,2
repeat
    print("hello")
    a = a+1
until a>b
--至少执行一次
local a,b = 3,2
repeat
    print("hello")
until a>b

--for语句 比较重要,是经常用的,尤其是在遍历集合的时候
--分为俩种,一种是数值for,一种是泛型for

--数值for 局部变量i的值刚开始是1,然后以第三个参数1为跳步,也就是每次加1,加到10不再执行循环,i等于10的时候也会被打印
for i = 1,10,1 do
    print(i)
end
--三个表达式只会被计算一次,并且是在循环开始前
-- 控制变量i是局部变量自动被声明,并且只在循环内有效

--泛型for
--范型for遍历迭代子函数返回的每一个值 ipairs和pairs就是一个迭代器(其实就是一个函数),迭代器将结果返回给for来遍历
local ta = {}
for i,v in pairs(ta) do
end

--break和return语句
--break语句用来退出当前循环(for、repeat、while)。在循环外部不可以使用。
--return用来从函数返回结果,当一个函数自然结束时,结尾会有一个默认的return。在语句中使用return的时候,return的下面不可以有其他的语句的,例如以下就是错误的。
if true then
    print(1)
    return
    local i = 2 
    print(i)
end 
--为了解决这个问题,我们可以这样做
if true then
    print(1)
    do
        return
    end
    local i = 2 
    print(i)
end

Lua语句

上边的例子中有涉及到迭代器,这里做进一步的说明。迭代器pairs()和ipairs()返回键和值,如果只想接受值而忽略键,可以使用_来接受这个键,如下所示。

local tab = {3,5,6,7,3}
for _,v in pairs(tab) do
    print(v) --3 5 6 7 3
end

迭代器说白了就是一个函数,下面就实现了一个自定义的迭代器,只返回值。

--迭代器可以遍历集合中的每一个元素,在Lua中我们常常使用函数来描述迭代器,每次调用该函数就返回集合的下一个元素。
--所以我们所说的迭代器在Lua中其实就是一个函数

--迭代器的实现
--迭代器需要保留上一次成功调用的状态,也就是说上一次遍历到了哪个元素,闭包提供的机制可以很容易实现这个任务。
--记住:闭包是一个内部函数,它可以访问一个或者多个外部函数的外部局部变量。
--每次闭包的成功调用后这些外部局部变量都保存他们的值(状态)。所以一个典型的闭包的结构包含两个函数:一个是闭包自己;另一个是工厂(创建闭包的函数)。

--一个迭代器的简单实现,这个迭代器只返回table的值

local function my_pair(tab)
	local i = 0
	return function()
	   i = i+1
	   return tab[i]
	end
end
--测试一下自己写得迭代器
local ta = {3,5,6,7,3}
for val in my_pair(ta) do
    print(val) --3 5 6 7 3
end

--泛型for的语义
--如果参数列表的第一个参数得到的值是nil,那么循环结束 也就是如果前面例子中得val为nil则结束循环