对lua泛型for迭代器一些理解

for 返回值1,返回值2,... in 函数,函数参数1,函数参数2,... do

1.lua泛型 for 在自己内部保存迭代函数,实际上它保存三个值:迭代函数、状态常量、控制变量。

--以下为无状态迭代器
function square(iteratorMaxCount,currentNumber)
   if currentNumberthen
      currentNumber = currentNumber+1
      return currentNumber, currentNumber*currentNumber
   end
end
--泛型 for 在自己内部保存迭代函数,实际上它保存三个值:
--迭代函数square、状态常量3、控制变量0
for i,n in square,3,0 do
   print(i,n)
end

理解看后面总结

2.对于多状态迭代器

--多状态迭代器
function elementIterator (collection)
   local index = 0
   local count = #collection
   -- 闭包函数
   return function ()
      index = index + 1
      if index <= count then
         --  返回迭代器的当前元素
         return collection[index]
      end
   end
end


for v in elementIterator({11,22,33}) do
    print(v)
end

理解看后面总结

3.自定义ipais

function iter (a, i)
    i = i + 1
    local v = a[i]
    if v then
       return i, v
    end
end

function ipairs (a)
    return iter, a, 0
end

for i,v in ipairs({111,222,333}) do
    print(i,v)
end

理解看下

综上总结一下:

1.我们先理解 for 语句的 意思

for …(1) in func(2) …(3) do

end

…(1) 是每次执行参数为…(3)的函数func(2)的返回值,直到返回nil,也就是…(1)整体为nil值时,循环结束?

例子

local a = 0
local function pa(b,c)
    a = a + 1
    if a < 5 then
        return 1,2,3,a
    else
        return nil
    end
end
for i,j,k,v in pa,1,1 do
    print(i,j,k,v)
end

2.理解了for的语义,我们再回头看下例子2

for v in elementIterator({11,22,33}) do
   print(v)
end

每次执行elementIterator({11,22,33})的返回值函数(注意,这里是执行elementIterator的返回值(一个函数),并不是执行elementIterator):

也就是每次执行函数

function ()
     index = index + 1
     if index <= count then
        -- 返回迭代器的当前元素
        return collection[index]
     end
end

该函数携带参数无,并且可以访问到elementIterator的局部参数? ?local index = 0? local count = #collection,其返回一个table中的元素,并且存到v中

3.对于例子1 这理解就简单多了

for 循环中 每次执行square函数,该函数携带两个参数iteratorMaxCount,currentNumber,初始化分别为3,0

函数返回两个值分别存到i,v中,直到返回整体为nil,循环结束

4.例子3,其实和例子1大同小异,ipairs (a) 其实是把函数itera,以及itera的参数a,i封装起来了

for i,v in ipairs({111,222,333}) do 

等价于

for i,v in iter,{111,222,333}, 0 do

5.再点一个,不别太在意?状态常量、控制变量 是什么意思,他们只是迭代函数的参数而已,并且这参数个数可有可无,可多可少,并非就一定得是(状态常量、控制变量)你两个而已

你可能感兴趣的:(Lua)