有狀態迭代器
有狀態迭代器帶有關於迭代器當前狀態的一些附加資訊。
使用表格
加法狀態可以打包到泛型 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