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