迭代器与closure

function allwords()
  local line=io.read()
  local pos=1
  return function()
    while line do 
      local s,e=string.find(line,"%w+",pos)
      if s then
        pos=e+1
        return string.sub(line,s,e)
      else
        line=io.read()
        pos=1
      end
    end
    print("function endddddddddd")
    return nil
  end
end

for word in allwords() do
  print(11111)
  print(word)
end


        

 无状态的迭代器

local function iter(a,i)
  i=i+1
  local v=a[i]
  if v then 
    return i,v
  end
end
function ipairs(a)
--  return iter,a,0 --正确--for获得3个值,迭代器函数,恒定状态,以及控制变量
  return iter(a,1) --错误
end

a={4,5,6,7}
--for k,v in ipairs(a) do 
--  print(k,v)
--end

for k,v in next,a do
  print(k,v)
end

 复杂迭代器

--复杂迭代器,不需要定义局部变量pos
local iterator
function allwords()
  local state={line=io.read(),pos=1}
  return iterator,state
end

function iterator(state)
  while state.line do
    local s,e=string.find(state.line,"%w+",state.pos)
    if s then 
      state.pos=e+1
      return string.sub(state.line,s,e)
    else
      state.line=io.read()
      state.pos=1
    end
  end
  return nil
end

for word in allwords() do
  print(11111)
  print(word)
end

 真实迭代器

 

function allwords(f)
  for line in io.lines() do
    for word in string.gmatch(line,"%w+") do
      f(word)
    end
  end
end
allwords(print)

 

相关文章: