迭代器:迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素
- function list_iter(t) --迭代器,返回元素值
- local i=0
- local n=table.getn(t)
- return function()
- i=i+1
- if i<=n then return t[i] end
- end
- end
- ----------------------------------------------------------
- t={10,20,30}
- iter=list_iter(t)
- while true do --while语句使用迭代器
- local element=iter()
- if element==nil then break end
- print(element)
- end
- --------------------------------------------------------
- for element in list_iter(t) do --for语句使用迭代器
- print(element)
- end
无状态的迭代器:是指不保留任何状态的迭代器,因此在循环中我们可以利用无状态迭代器避免创建闭包花费额外的代价。
- a={"one","two","three"}
- for i,v in ipairs(a) do
- print(i,v)
- end
- -------------------------------------------------------------------
- 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
- end
多状态的迭代器:迭代器需要保存多个状态信息,将所有的状态信息封装到 table 内,将 table作为迭代器的状态常量
- local iterator
- function allwords()
- local state={line=io.read(),pos=1}
- return iterator,state
- end
- function iterator(state)
- while state.line do
- local begin_index,end_index=string.find(state.line,"%W+",state.pos)
- if begin_index then
- state.pos=end_index+1
- return string.sub(state.line,begin_index,end_index)
- else
- state.line=io.read()
- state.pos=1
- end
- end
- return nil
- end
迭代器接受一个函数作为参数,并且这个函数在迭代器内部被调用。
- function allwords(f)
- for l in io.lines("56.txt") do
- f(l) --调用print函数
- end
- end
- allwords(print) --传入print函数作为参数