lua|lua学习之迭代器与泛型 for 第二篇

迭代器与泛型 for 2 无状态的迭代器

  1. 自身不保存任何状态的迭代器
  2. 可以在多个循环中适用同一个无状态的迭代器,避免创建新的 closure 开销
  3. 在每次迭代中,for 循环都会用恒定状态和控制变量来调用迭代器函数
  4. 一个无状态的迭代器可以根据这两个值来为下次迭代生成下一个元素
a = {"one", "two", "three"} for i, v in ipairs(a) do print(i, v) endlocal function iter (a, i) i = i + 1 if v then return i, v -- 1, [a1] -- 2, a[2] -- n, a[n] = nil end endfunction ipairs(a) return iter, a, 0 end-- next 会以 table 中的任意次序返回一组值 -- 返回,此 table 的下一个 key 和 这个 key 所对应的值 -- next(t, nil) 返回 table 的第一组值。若没有下一组值,则返回 nil a= {"one", "two", "three", "four"} for i, v in next, a, nil do print(i, v) end --[[ 1one 2two 3three 4four ]] print(next(a, nil)) -- 1 one 实际上等同于返回第一组key,value print(next(a, 1)) -- 2 two print(next(a, 2)) -- 3 three print(next(a, 3)) -- 4 four print(next(a, 4)) -- nil 实际上最后一组的下一组即没有任何元素function pairs(t) return next, t, nil-- next(t, k) t 为 table ,k 为这个table的键 endfunction k, v in next, t do end

遍历链表的无状态迭代器
  1. 将链表的头结点作为恒定状态即 traverse 返回的第二个值
  2. 将当前结点作为控制变量
  3. 第一次调用迭代器函数 getnext 时,nodenil
  4. 因此函数返回 list 作为第一个结点
  5. 在后续调用中 node 不再为 nil时就会返回 node.next
local function getnext(list, node) -- 迭代器函数 if not node then return list else return node.next end endfunction traverse(list) return getnext, list, nil endlist = nil for line in io.lines() do list = {next = list, value = https://www.it610.com/article/line} endfor node in traverse(list) do print(node.value) end

【lua|lua学习之迭代器与泛型 for 第二篇】
本篇文章由一文多发平台ArtiPub自动发布

    推荐阅读