欢迎光临散文网 会员登陆 & 注册

泛型for循环简单介绍

2020-02-24 04:46 作者:多华宫与火火里  | 我要投稿

枚举型(泛型)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这个匹配函数,它的返回值就是一个迭代器函数




文章最后,提点别的,有谁知道下面这幅画的出处吗,好几年过去了我都没找到,我是真的超喜欢这幅画!


泛型for循环简单介绍的评论 (共 条)

分享到微博请遵守国家法律