lua for in理解

# for in遍历, 跟在in后面是3个参数:iteratorFunc, iteratorObj, initArg

第1次时,会用iteratorObj和initArg调用iteratorFunc, iteratorFunc(iteratorObj, initArg)

第2次时,会用iteratorFunc的第1个返回值继续调用iteratorFunc

第3次时,和第2次一样

直到iteratorFunc的第1个返回值为nil时,结束循环

 

【pairs和ipairs都只是函数而已】

可以执行下面的代码验证下:

local arr = { 19, 15, 37 }
local iteratorFunc, iteratorObj, initKey = pairs(arr)
print(type(iteratorFunc)) --function
print(type(iteratorObj)) --table
print(type(initKey), initKey) --nil, nil

 

local arr = { 19, 15, 37 }
local iteratorFunc, iteratorObj, initKey = ipairs(arr)
print(type(iteratorFunc)) --function
print(type(iteratorObj)) --table
print(type(initKey), initKey) --number, 0

 

【实现自己的pairs】

function myPairs(tb)
    local iteratorFunc = function(iteratorObj, key)
        local k, v = next(iteratorObj, key)
        return k, v
    end

    return iteratorFunc, tb, nil
end

local arr = {"one", "two", "three"}
for k, v in myPairs(arr) do
    print(k, v)
end

 

【in后直接用参数】

local iteratorFunc = function(iteratorObj, index)
    index = index + 1
    local ret2 = iteratorObj[index]
    if nil ~= ret2 then
        return index, ret2
    end
    return nil --结束循环
end

local arr = { "one", "two", "three"}
for index, v in iteratorFunc,arr,0 do
    print(index, v)
end

 

【for后面跟3个值也是可以的】

local execCount = 0
local iteratorFunc = function(iteratorObj, key)
    if execCount >= 3 then
        return nil --执行第4次时结束循环
    end

    execCount = execCount + 1
    local a1 = execCount
    local a2 = execCount + 100
    local a3 = execCount + 200
    return a1, a2, a3
end


for a1, a2, a3 in iteratorFunc do
    print(a1, a2, a3)
end

 

【用while来执行pairs】

local arr = { "one", "two", "three" }
local iteratorFunc, iteratorObj, initKey = pairs(arr)
local key = initKey
while true do
    local k, v = iteratorFunc(iteratorObj, key)
    if nil == k then break end
    key = k
    print(k, v)
end

 

【参考】

https://www.cnblogs.com/withpear/p/15016676.html, control

https://blog.csdn.net/weixin_38239050/article/details/82498012, control

https://blog.csdn.net/fjjaylz/article/details/105062341, ok

https://www.cnblogs.com/Richard-Core/p/4343635.html

 Lua 迭代器_lua迭代器-CSDN博客

posted @ 2021-11-06 17:36  yanghui01  阅读(983)  评论(0编辑  收藏  举报