如何将任意迭代器作为函数参数传递?

问题描述 投票:0回答:1
问题

如果我编写一个通用的

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
有什么不同?

lua iterator
1个回答
0
投票

pairs
函数返回3个值:

  1. next
    功能
  2. 桌子
  3. 初始键
    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
© www.soinside.com 2019 - 2024. All rights reserved.