范型for
范型for的格式如下所示:
for <var-list> in <exp-list> do<body>
end
var-list指变量名列表,可以为多个,exp-list指表达式列表,通常情况下只有一个值。可以更具体地写为另一种形式:
for var_1, ..., var_n in explist(s) do block end
例如代码块中常见的for k,v in pairs(tb) do end或者for k,v in ipairs(tb) do end,都是这种范型形式,如若转换成while形式则如下:
local func = explist
local s
while true dolocal var_1, ..., var_n = func(s)if var_1 == nil thenbreakendblock
end
源函数iter、ipairs、pairs实现
可以随意写一个简单的迭代器循环:
function iter(a)local i = 0return function()i = i + 1return a[i]end
endfor n in iter({1,2,3}) doprint(n) -- 1 2 3
end
相当于是以下代码结构:
local iterator = iter({1,2,3})
local n = iterator()
while n doprint(n)n = iterator()
end
ipairs函数只不过是上面iter内部的return a[i]改为return i,a[i]罢了。
pairs函数则是用到了next方法:
function pairsMySelf(a)local key,value = next(a)return function()local oldKey,oldValue = key,valueif value ~= nil thenkey,value = next(a,key)endreturn oldKey,oldValueend
endlocal tb = {["a"] = 1,["b"] = 1,["c"] = 1,
}
for k,v in pairsMySelf(tb) doprint(k,v)
end
--[[print:a 1b 1c 1
]]--