泛型for循環(huán)簡(jiǎn)單介紹
枚舉型(泛型)for循環(huán)是用來以遍歷一個(gè)集合中所有元素的,比如它可以一個(gè)個(gè)枚舉出一個(gè)table的所有下標(biāo)和數(shù)值

比如現(xiàn)在有一個(gè)table是tbl={h="84ssh",c=233,[7]=66}
然后用for循環(huán)來枚舉出tbl這個(gè)表的元素
for sssss,rrrrrr in pairs(tbl) do?? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?--[[首先這一句基本上就是固定格式,前面的sssss和rrrrrr都是你自己取名字的變量。然后那個(gè)pairs是每一對(duì)的意思,它是一個(gè)迭代器(等會(huì)簡(jiǎn)單介紹),我們知道在table里一個(gè)下標(biāo)和一個(gè)值是成對(duì)出現(xiàn)的、有下標(biāo)就有值,有值就有下標(biāo),它們就是一對(duì)一對(duì)的,你用這個(gè)for sssss,rrrrrr in?pairs(tbl) do 就可以列出每一對(duì)下標(biāo)和值,而pairs里填的tbl就是你指定的要枚舉的那一個(gè)table。--]]
print(sssss..","..rrrrrr)? ? ? ? ? ? ? ? ? ? ? ? ?--然后直接看看出來的sssss和rrrrrr是什么
end
然后執(zhí)行以后你就會(huì)看到結(jié)果是
h,84ssh
c,233
7,66
這就說明在一次次的循環(huán)中,變量sssss和rrrrrr被被動(dòng)賦值,sssss得到了下標(biāo),而rrrrrr對(duì)應(yīng)的得到了相應(yīng)的值。當(dāng)然結(jié)果就是for循環(huán)遍歷了整個(gè)tbl這個(gè)表的所有元素
利用枚舉型for循環(huán)可以計(jì)算下標(biāo)不連續(xù)的table的元素個(gè)數(shù),因?yàn)槿绻聵?biāo)是字符串的話就不能用#來計(jì)算table的長(zhǎng)度了,所以現(xiàn)在可以這么寫:
function get(xx)
local n=0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?--[[一開始n=0然后準(zhǔn)備讓它循環(huán)一次就變大1,只要循環(huán)表的元素個(gè)數(shù)次即可--]]
for?k,v in?pairs(xx) do
n=n+1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? --[[每循環(huán)一次n就加1,又因?yàn)檫@個(gè)泛型for循環(huán)可以遍歷整個(gè)表,所以到最后n的值就是循環(huán)的次數(shù)、就是有多少個(gè)元素、就是表的長(zhǎng)度--]]
end
return n
end
然后就可以用這個(gè)函數(shù)來求比如剛剛前面定義過的表tbl
比如? local aaa=get(tbl)? ? ? ? ? ?print(aaa)這樣就能得到表tbl的長(zhǎng)度了
然后再講迭代器之前,先區(qū)分一下遞歸和迭代:

那迭代器是什么呢,迭代器本身就是個(gè)函數(shù)(叫做迭代器函數(shù)),然后它的內(nèi)部還存在一個(gè)執(zhí)行迭代的函數(shù)(這執(zhí)行迭代的函數(shù)稱為迭代函數(shù))。
迭代器能夠用來遍歷某些集合中的部分或全部元素,每次調(diào)用該函數(shù)(迭代器)就返回集合的下一個(gè)元素。
所以才有剛剛說的泛型for的格式:

對(duì)于迭代器,為了更形象的理解,可以自定一個(gè)迭代器看看,比如:
function Iterator (tbl)
? ? ??? local index = 0
? ??? ? local count = #tbl
? ? ??? return function ()
? ? ? ? ? ? ??? ? index = index + 1
? ? ? ? ? ? ? ? ? if index <= count
? ? ? ? ? ? ? ??? then
? ? ?? ? ? ? ? ???return index,tbl[index]? ? ? ? ? ?????--? 返回迭代器的當(dāng)前下標(biāo)和元素
? ? ? ? ? ? ? ? ??end
? ? ? ? end
end
可以看到,這個(gè)Iterator函數(shù)就是個(gè)迭代器,然后它里面有個(gè)迭代函數(shù)
現(xiàn)在比如你有個(gè)table是ooo={"cct73",233,66,"ccx45"}? ? ? ? 那么再用泛型for循環(huán)
for _,cc in?Iterator(ooo) do?print(_.."? ?"..cc) end? ? ? ? ? ? ? ? ? ?--[[一般如果用不到兩個(gè)傳遞參數(shù)的話,可以簡(jiǎn)寫成_和_也就是寫成 for _,_ in 迭代器 do 這種樣子,因?yàn)檎f了這里變量名自定--]]
然后你就會(huì)得到結(jié)果
1? ?cct73
2? ?233
3? ?66
4? ?ccx45
也就是用迭代器函數(shù)Iterator遍歷了ooo這個(gè)表,當(dāng)然現(xiàn)在寫的這個(gè)Iterator函數(shù)明顯只能遍歷從下標(biāo)1開始的連續(xù)數(shù)字下標(biāo)的元素,因?yàn)楹瘮?shù)里設(shè)定的變量index 一開始得0,執(zhí)行迭代函數(shù)的時(shí)候index 就從1開始,每一次index =index +1,所以就只能遍歷出從1開始的一段連續(xù)下標(biāo)的元素,如果下標(biāo)數(shù)字不連續(xù)了,或者下標(biāo)是字符串了,那么就斷掉了,后面就遍歷不到了。
所以在介紹泛型for的時(shí)候說的pairs()就是一個(gè)迭代器

另外,最后提一下break的用法

還有break只能用在循環(huán)里面,比如for循環(huán)、while循環(huán)、repeat循環(huán)
你用一個(gè)break就能跳出這一個(gè)循環(huán),如果你有循環(huán)嵌套,那你break也只是跳出那一個(gè)當(dāng)前層的循環(huán)、break只是結(jié)束當(dāng)前所在的嵌套層,所以這樣break以后就會(huì)開始執(zhí)行外層的循環(huán)語句
這之后的視頻還會(huì)介紹返回值是迭代器的函數(shù)

比如gamtch這個(gè)匹配函數(shù),它的返回值就是一個(gè)迭代器函數(shù)
文章最后,提點(diǎn)別的,有誰知道下面這幅畫的出處嗎,好幾年過去了我都沒找到,我是真的超喜歡這幅畫!
