有状态迭代器
有状态迭代器带有关于迭代器当前状态的一些附加信息。
使用表格
加法状态可以打包到泛型 for 循环的不变状态中。
local function chars_iter(t, i)
local i = i + 1
if i <= t.len then
return i, t.s:sub(i, i)
end
end
local function chars(s)
-- the iterators state
local t = {
s = s, -- the subject
len = #s -- cached length
}
return chars_iter, t, 0
end
for i, c in chars 'abcde' do
print(i, c) --> 1 a, 2 b, 3 c, 4 d, 5 e
end
使用闭包
附加状态可以包含在函数闭包中。由于状态完全包含在闭包范围内,因此不需要不变状态和控制变量。
local function chars(s)
local i, len = 0, #s
return function() -- iterator function
i = i + 1
if i <= len then
return i, s:sub(i, i)
end
end
end
for i, c in chars 'abcde' do
print(i, c) --> 1 a, 2 b, 3 c, 4 d, 5 e
end
使用协同程序
附加状态可以包含在协程中,同样不需要不变状态和控制变量。
local function chars(s)
return coroutine.wrap(function()
for i = 1, #s do
coroutine.yield(s:sub(i, i))
end
end)
end
for c in chars 'abcde' do
print(c) --> a, b, c, d, e
end