泛型for循环简单介绍
枚举型(泛型)for循环是用来以遍历一个集合中所有元素的,比如它可以一个个枚举出一个table的所有下标和数值

比如现在有一个table是tbl={h="84ssh",c=233,[7]=66}
然后用for循环来枚举出tbl这个表的元素
for sssss,rrrrrr in pairs(tbl) do --[[首先这一句基本上就是固定格式,前面的sssss和rrrrrr都是你自己取名字的变量。然后那个pairs是每一对的意思,它是一个迭代器(等会简单介绍),我们知道在table里一个下标和一个值是成对出现的、有下标就有值,有值就有下标,它们就是一对一对的,你用这个for sssss,rrrrrr in pairs(tbl) do 就可以列出每一对下标和值,而pairs里填的tbl就是你指定的要枚举的那一个table。--]]
print(sssss..","..rrrrrr) --然后直接看看出来的sssss和rrrrrr是什么
end
然后执行以后你就会看到结果是
h,84ssh
c,233
7,66
这就说明在一次次的循环中,变量sssss和rrrrrr被被动赋值,sssss得到了下标,而rrrrrr对应的得到了相应的值。当然结果就是for循环遍历了整个tbl这个表的所有元素
利用枚举型for循环可以计算下标不连续的table的元素个数,因为如果下标是字符串的话就不能用#来计算table的长度了,所以现在可以这么写:
function get(xx)
local n=0 --[[一开始n=0然后准备让它循环一次就变大1,只要循环表的元素个数次即可--]]
for k,v in pairs(xx) do
n=n+1 --[[每循环一次n就加1,又因为这个泛型for循环可以遍历整个表,所以到最后n的值就是循环的次数、就是有多少个元素、就是表的长度--]]
end
return n
end
然后就可以用这个函数来求比如刚刚前面定义过的表tbl
比如 local aaa=get(tbl) print(aaa)这样就能得到表tbl的长度了
然后再讲迭代器之前,先区分一下递归和迭代:

那迭代器是什么呢,迭代器本身就是个函数(叫做迭代器函数),然后它的内部还存在一个执行迭代的函数(这执行迭代的函数称为迭代函数)。
迭代器能够用来遍历某些集合中的部分或全部元素,每次调用该函数(迭代器)就返回集合的下一个元素。
所以才有刚刚说的泛型for的格式:

对于迭代器,为了更形象的理解,可以自定一个迭代器看看,比如:
function Iterator (tbl)
local index = 0
local count = #tbl
return function ()
index = index + 1
if index <= count
then
return index,tbl[index] -- 返回迭代器的当前下标和元素
end
end
end
可以看到,这个Iterator函数就是个迭代器,然后它里面有个迭代函数
现在比如你有个table是ooo={"cct73",233,66,"ccx45"} 那么再用泛型for循环
for _,cc in Iterator(ooo) do print(_.." "..cc) end --[[一般如果用不到两个传递参数的话,可以简写成_和_也就是写成 for _,_ in 迭代器 do 这种样子,因为说了这里变量名自定--]]
然后你就会得到结果
1 cct73
2 233
3 66
4 ccx45
也就是用迭代器函数Iterator遍历了ooo这个表,当然现在写的这个Iterator函数明显只能遍历从下标1开始的连续数字下标的元素,因为函数里设定的变量index 一开始得0,执行迭代函数的时候index 就从1开始,每一次index =index +1,所以就只能遍历出从1开始的一段连续下标的元素,如果下标数字不连续了,或者下标是字符串了,那么就断掉了,后面就遍历不到了。
所以在介绍泛型for的时候说的pairs()就是一个迭代器

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

还有break只能用在循环里面,比如for循环、while循环、repeat循环
你用一个break就能跳出这一个循环,如果你有循环嵌套,那你break也只是跳出那一个当前层的循环、break只是结束当前所在的嵌套层,所以这样break以后就会开始执行外层的循环语句
这之后的视频还会介绍返回值是迭代器的函数

比如gamtch这个匹配函数,它的返回值就是一个迭代器函数
文章最后,提点别的,有谁知道下面这幅画的出处吗,好几年过去了我都没找到,我是真的超喜欢这幅画!
