Lua 語(yǔ)言提供了以下幾種循環(huán)處理方式:
while 循環(huán):在條件為 true 時(shí),讓程序重復(fù)地執(zhí)行某些語(yǔ)句副瀑。執(zhí)行語(yǔ)句前會(huì)先檢查條件是否為 true
for 循環(huán):重復(fù)執(zhí)行指定語(yǔ)句糠睡,重復(fù)次數(shù)可在 for 語(yǔ)句中控制。
repeat...until :重復(fù)執(zhí)行循環(huán)狈孔,直到 指定的條件為真時(shí)為止
循環(huán)嵌套:可以在循環(huán)內(nèi)嵌套一個(gè)或多個(gè)循環(huán)語(yǔ)句(while do ... end;for ... do ... end;repeat ... until;)
一、While循環(huán)
Lua 編程語(yǔ)言中 while 循環(huán)語(yǔ)句在判斷條件為 true 時(shí)會(huì)重復(fù)執(zhí)行循環(huán)體語(yǔ)句嫁赏。
statements(循環(huán)體語(yǔ)句) 可以是一條或多條語(yǔ)句油挥,condition(條件) 可以是任意表達(dá)式款熬,在 condition(條件) 為 true 時(shí)執(zhí)行循環(huán)體語(yǔ)句贤牛。
while結(jié)構(gòu)體,輸出數(shù)字1-20
a=1
while (a<=20) do--while循環(huán)輸出1-20
print (a)
a=a+1--Lua中不能使用a++自增
end
輸出1-20奇數(shù)
a=1
while (a<=20) do--while循環(huán)輸出1-20
if (a%2==1) then
print(a)
end
a=a+1--Lua中不能使用a++自增
end
二则酝、For循環(huán)
Lua 編程語(yǔ)言中 for 循環(huán)語(yǔ)句可以重復(fù)執(zhí)行指定語(yǔ)句,重復(fù)次數(shù)可在 for 語(yǔ)句中控制喂链。
Lua 編程語(yǔ)言中 for語(yǔ)句有兩大類(lèi)::
數(shù)值for循環(huán)
泛型for循環(huán)
(1)數(shù)值 for循環(huán)
Lua 編程語(yǔ)言中數(shù)值for循環(huán)語(yǔ)法格式:
for var=start,end,step do
循環(huán)體
end
--這里var會(huì)從start變化到end,每次變化--step步長(zhǎng)變化
例如以下for循環(huán)代碼遍歷出1-10的順序和倒序排列
for i=1,10,1 do--順序
print(i)
end
for i=10,1,-1 do--倒序
print(i)
end
(2)泛型 for循環(huán)
泛型for循環(huán)通過(guò)一個(gè)迭代器函數(shù)來(lái)遍歷所有值妥泉,類(lèi)似C#中的foreach語(yǔ)句。
Lua 編程語(yǔ)言中泛型for循環(huán)語(yǔ)法格式:
--打印tab的所有值
for k,v in pairs(tab)
do print(k,v)
end
例如遍歷一張表中所有的key和value
tab={key1="value1",key2="value2"}
for k,v in pairs(tab) do
print(k,v)
end
輸出結(jié)果:
key1 value1
key2 value2
三蝇率、repeat...until循環(huán)
我們注意到循環(huán)條件判斷語(yǔ)句(condition)在循環(huán)體末尾部分刽沾,所以在條件進(jìn)行判斷前循環(huán)體都會(huì)執(zhí)行一次。
如果條件判斷語(yǔ)句(condition)為 false锅尘,循環(huán)會(huì)重新開(kāi)始執(zhí)行布蔗,直到條件判斷語(yǔ)句(condition)為 true 才會(huì)停止執(zhí)行。
Lua repeat...until 循環(huán)流程圖如下:
C#中do while 是當(dāng)滿(mǎn)足條件執(zhí)行而repeat until是直到滿(mǎn)足條件停止執(zhí)行
例如如下程序輸出數(shù)字1-10
repeat
print(b)
b=b+1
until (b>10)--直到b>10才會(huì)停止執(zhí)行
四顿乒、循環(huán)嵌套
例子:我們輸出1輸出一次2輸出2次以此類(lèi)推10輸出十次泽谨,我們用for嵌套for和for嵌套while試試,代碼如下
for i=1,10 do
for j=1,i do
print(i)
end
end
for i=1,10 do
j=1
while (j<=i)
print(i)
j=j+1
end
end
IF語(yǔ)句
if語(yǔ)句結(jié)構(gòu)
if(布爾表達(dá)式)then
為true的時(shí)候要執(zhí)行的代碼
end
五、迭代器函數(shù)(pairs與ipairs)
迭代器(iterator)是一種對(duì)象骨杂,它能夠用來(lái)遍歷標(biāo)準(zhǔn)模板庫(kù)容器中的部分或全部元素雄卷,每個(gè)迭代器對(duì)象代表容器中的確定的地址
在Lua中迭代器是一種支持指針類(lèi)型的結(jié)構(gòu),它可以遍歷集合的每一個(gè)元素陕凹。
在遍歷table的時(shí)候有一個(gè)pairs函數(shù)還有另一個(gè)ipairs函數(shù),那么這兩個(gè)有什么區(qū)別呢
pairs:迭代 table杜耙,可以遍歷表中所有的 key 可以返回 nil
ipairs:迭代數(shù)組,不能返回 nil,如果遇到 nil 則退出
array={"Lua","C#","JAVA","C"}
array[2]=nil
for k,v in pairs(array) do
print(k,v)
end
for k,v in ipairs(array) do
print(k,v)
end
輸出結(jié)果
1 Lua
3 JAVA
4 C
1 Lua
pairs迭代table记靡,遍歷表中所有的Key和Value
ipairs安裝索引從1開(kāi)始团驱,遞增遍歷,遇到nil值就停止
自定義迭代函數(shù)
以下是泛型for的結(jié)構(gòu)體
for 變量列表 in 迭代函數(shù) 狀態(tài)變量 控制變量 do
--循環(huán)體
end
執(zhí)行過(guò)程:
1,調(diào)用迭代函數(shù)寸痢,(把狀態(tài)變量和控制變量當(dāng)作參數(shù)傳遞給迭代函數(shù))
2紊选,如果迭代函數(shù)的返回值為nil,退出for循環(huán)
如果不是nil的話(huà)献烦,把返回值賦值給變量列表卖词,并執(zhí)行循環(huán)體
--自定義迭代函數(shù)
--state(狀態(tài)變量):循環(huán)的次數(shù) control(控制變量):當(dāng)前循環(huán)次數(shù)
function square(state,control)
if(control>=state)then
return nil
else
control=control+1
return control,control*control
end
end
--遍歷
for i,j in square,9,0 do
print(i,j)
end
輸出結(jié)果
1 1
2 4
3 9
4 16
5 25
6 36
7 49
8 64
9 81