搜索
写经验 领红包
 > 家居

lua迭代器怎么使用(迭代器iteato)

导语:lua学习之迭代器与泛型 for 第二篇

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

自身不保存任何状态的迭代器可以在多个循环中适用同一个无状态的迭代器,避免创建新的 closure 开销在每次迭代中,for 循环都会用恒定状态和控制变量来调用迭代器函数一个无状态的迭代器可以根据这两个值来为下次迭代生成下一个元素

a = {&34;, &34;, &34;}for i, v in ipairs(a) do    print(i, v)end​local function iter (a, i)    i = i + 1    if v then        return i, v         -- 1, [a1]        -- 2, a[2]        -- n, a[n] = nil    endend​function ipairs(a)    return iter, a, 0end​-- next 会以 table 中的任意次序返回一组值-- 返回,此 table 的下一个 key 和 这个 key 所对应的值-- next(t, nil) 返回 table 的第一组值。若没有下一组值,则返回 nila  = {&34;, &34;, &34;, &34;}for i, v in next, a, nil do    print(i, v)end--[[1       one2       two3       three4       four]]print(next(a, nil)) -- 1 one 实际上等同于返回第一组key,valueprint(next(a, 1)) -- 2 twoprint(next(a, 2)) -- 3 threeprint(next(a, 3)) -- 4 fourprint(next(a, 4)) -- nil 实际上最后一组的下一组即没有任何元素​function pairs(t)    return next, t, nil  -- next(t, k) t 为 table ,k 为这个table的键end​function k, v in next, t do    <loop body>end​

遍历链表的无状态迭代器将链表的头结点作为恒定状态即 traverse 返回的第二个值将当前结点作为控制变量第一次调用迭代器函数 getnext 时,node 为 nil因此函数返回 list 作为第一个结点在后续调用中 node 不再为 nil时就会返回 node.next了
local function getnext(list, node) -- 迭代器函数    if not node then        return list    else        return node.next    endend​function traverse(list)    return getnext, list, nilend​list = nilfor line in io.lines() do    list = {next = list, value = line}end​for node in traverse(list) do    print(node.value)end

本文内容由小里整理编辑!