无状态迭代器
无论对与 ipairs代表无状态的迭代器。无状态迭代器仅使用泛型 for 循环的控制变量和不变状态来计算迭代值。
对迭代器
我们可以使用 next
函数实现无状态 pairs
迭代器。
-- generator function which initializes the generic for loop
local function pairs(t)
-- next is the iterator function
-- t is the invariant state
-- control variable is nil
return next, t, nil
end
Ipairs 迭代器
我们可以在两个独立的函数中实现无状态 ipairs
迭代器。
-- function which performs the actual iteration
local function ipairs_iter(t, i)
local i = i + 1 -- next index in the sequence (i is the control variable)
local v = t[i] -- next value (t is the invariant state)
if v ~= nil then
return i, v -- index, value
end
return nil -- no more values (termination)
end
-- generator function which initializes the generic for loop
local function ipairs(t)
-- ipairs_iter is the iterator function
-- t is the invariant state (table to be iterated)
-- 0 is the control variable (first index)
return ipairs_iter, t, 0
end
角色迭代器
我们可以通过履行通用 for
循环的契约来创建新的无状态迭代器。
-- function which performs the actual iteration
local function chars_iter(s, i)
if i < #s then
i = i + 1
return i, s:sub(i, i)
end
end
-- generator function which initializes the generic for loop
local function chars(s)
return chars_iter, s, 0
end
-- used like pairs and ipairs
for i, c in chars 'abcde' do
print(i, c) --> 1 a, 2 b, 3 c, 4 f, 5 e
end
Prime Number 迭代器
这是无状态迭代器的一个更简单的例子。
-- prime numbers iterator
local incr = {4, 1, 2, 0, 2}
function primes(s, p, d)
s, p, d = s or math.huge, p and p + incr[p % 6] or 2, 1
while p <= s do
repeat
d = d + incr[d % 6]
if d*d > p then return p end
until p % d == 0
p, d = p + incr[p % 6], 1
end
end
-- print all prime numbers <= 100
for p in primes, 100 do -- passing in the iterator (do not call the iterator here)
print(p) --> 2 3 5 7 11 ... 97
end
-- print all primes in endless loop
for p in primes do -- please note: "in primes", not "in primes()"
print(p)
end