Lua开发学习4-普通循环和迭代器循环

说句实话,每当看到Lua代码,我都感觉是半个SQL代码,写起来还是感觉有点恐怖。

while循环:

与C#的while循环类似,没有什么好说的;

--------Lua的while循环
while(condition)
    do
       statements
    end

For循环

exp1为起点,exp2为终点,exp3为步进值,若exp3没有写,则默认为1

Lua的For循环
for var=exp1,exp2,exp3
do  
        <执行体>  
end  

Repeat循环:

看起来很高大上的说法, 实则就是我们平时使用的do..while循环而已

a = 10
--[ 执行循环 --]
repeat
   print("a的值为:", a)
   a = a + 1
until( a > 15 )

迭代器循环:

C#里面的迭代器循环使用的最多的当然是foreach循环了,当然协程也是个迭代器循环,我们这里只是举例,所以我们这里就不要讲太多了

array = {"Lua", "Tutorial"} --一个Table,也能想象成一个字典

lua的迭代器分为无状态迭代器和多状态迭代器

无状态迭代器:

function square(iteratorMaxCount,currentNumber)
   if currentNumber<iteratorMaxCount
   then
      currentNumber = currentNumber+1
   return currentNumber, currentNumber*currentNumber
   end
end


for i,n in square,3,0  --square是一个可以参与运行的函数,3和0为参数
do
   print(i,n)
end

多状态迭代器:

多状态迭代器可以遍历一个函数的结果集和pairs和ipairs两种特殊迭代方式

迭代函数的结果集:

array = {"Lua", "Tutorial"}

function elementIterator (collection)
   local index = 0
   local count = #collection --井号能取出collection参数的数量,若为[1] = ,[2] = ,则取出从第一个元素连续最多元素的数量,假如没有3,直接跳到了[4] = ,则#collection的值为2
   -- 闭包函数
   return function ()
      index = index + 1
      if index <= count
      then
         --  返回迭代器的当前元素
         return collection[index]
      end
   end
end

for element in elementIterator(array)
do
   print(element)
end

pairs: 迭代 table,可以遍历表中所有的 key 可以返回 nil

ipairs: 迭代数组,不能返回 nil,如果遇到 nil 则退出

local tab= { 
[1] = "a", 
[3] = "b", 
[4] = "c" 
} 
for i,v in pairs(tab) do        -- 输出 "a" ,"b", "c"  ,
    print( tab[i] ) 
end 

for i,v in ipairs(tab) do    -- 输出 "a" ,k=2时断开 
    print( tab[i] ) 
end

ipairs的迭代,会像C#的foreach那样,挨个写入堆栈。

但重要点说明一下paris跌代,或取的数据顺序并不是一个让人很好理解的顺序,因为它并不会按照1234这种顺序排下来,paris迭代产生的结果列表的排列,是按照一定的希哈规律来排列的,所以并不是无规则的无序,而是按哈规则的有序。

如果数据量非常庞大的话,paris的希哈排列,会造成性能上非常大的优势,倘若将列表值赋值给C#,然后以linq、lambda的方式来取,则也并不需要有序。

所以不要纠结于paris中看似无序实则有序的排列。

小时候我把老婆种到地下,长大了我能收获一大堆老婆! 我是威少,我是一名Unity游戏的主程,我为自己带盐,希望此文能给您一点点微不足道的帮助,祝你成功!
原文地址:https://www.cnblogs.com/vsirWaiter/p/6712529.html