如果我编写一个通用的
walk
例程,为什么我可以传入自己的迭代器而不是 pairs
?
这是一个简单的步行,为
src
中的每个项目执行一些操作。
function walk(src)
for n,i in src do
print(n, i[1]+i[#i]) end end
如果我用
walk(items(x))
来调用它,那么 walk
就可以正常工作。
function items(lst, n)
n=0
return function()
if lst and n < #lst then
n=n+1
return n,lst[n] end end end
x={
{1,2},
{3,4},
{5,6},
{5,6}}
walk(items(x)) --> prints out (1,3),(2,7),(3,11),etc
但我尝试用
pairs(x)
做同样的事情,我崩溃了。
walk(pairs(x))
lua: x.lua: bad argument #1 to 'for iterator' (table expected, got nil)
stack traceback:
[C]: in function 'next'
x.lua:7: in function 'walk'
x.lua:31: in main chunk
[C]: in ?
那么
pairs
和我自己的迭代器items
有什么不同?
pairs
函数返回3个值:
next
功能nil
for-in
语句在等效过程中使用3个值,如下所示:
local f, t, k = pairs(x)
local v
repeat
k, v = f(t, k)
if k then
-- for body
end
until not k
由于第 3 个值始终为
nil
,因此如果您希望 walk
函数对 pairs
有效,则至少需要 2 个参数:
function walk(itor, t)
for n,i in itor, t do
print(n, i[1]+i[#i]) end end