Lua迭代器以及各种源函数的实现
范型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 do
local var_1, ..., var_n = func(s)
if var_1 == nil then
break
end
block
end
源函数iter、ipairs、pairs实现
可以随意写一个简单的迭代器循环:
function iter(a)
local i = 0
return function()
i = i + 1
return a[i]
end
end
for n in iter({1,2,3}) do
print(n) -- 1 2 3
end
相当于是以下代码结构:
local iterator = iter({1,2,3})
local n = iterator()
while n do
print(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,value
if value ~= nil then
key,value = next(a,key)
end
return oldKey,oldValue
end
end
local tb = {
["a"] = 1,
["b"] = 1,
["c"] = 1,
}
for k,v in pairsMySelf(tb) do
print(k,v)
end
--[[print:
a 1
b 1
c 1
]]--