美文网首页
lua学习之迭代器与泛型 for 第二篇

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

作者: 跃千山 | 来源:发表于2020-03-02 14:13 被阅读0次

迭代器与泛型 for 2

无状态的迭代器

  1. 自身不保存任何状态的迭代器
  2. 可以在多个循环中适用同一个无状态的迭代器,避免创建新的 closure 开销
  3. 在每次迭代中,for 循环都会用恒定状态和控制变量来调用迭代器函数
  4. 一个无状态的迭代器可以根据这两个值来为下次迭代生成下一个元素
a = {"one", "two", "three"}
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
    end
end

function 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
--[[
1       one
2       two
3       three
4       four
]]
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的键
end

function k, v in next, t do
    <loop body>
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
end

function traverse(list)
    return getnext, list, nil
end

list = nil
for line in io.lines() do
    list = {next = list, value = line}
end

for node in traverse(list) do
    print(node.value)
end

本篇文章由一文多发平台ArtiPub自动发布

相关文章

  • lua学习之迭代器与泛型for第一篇

    迭代器与泛型 for 1 迭代器与 closure 「迭代器」是一种可以遍历一种集合中的所有元素的机制 在 lua...

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

    迭代器与泛型 for 2 无状态的迭代器 自身不保存任何状态的迭代器 可以在多个循环中适用同一个无状态的迭代器,避...

  • lua入门笔记 目录

    lua的中文API lua入门笔记1 类型 表达式 语句 函数lua入门笔记2 深入函数 深入函数 迭代器与泛型f...

  • Lua学习笔记(6)——迭代器与泛型for

    迭代器与closure 1.迭代器,就是一种可以遍历(iterate over)一种集合中所有元素的机制,它通常便...

  • lua学习之迭代器与泛型 for 第三篇

    迭代器与泛型 for 3 具有复杂状态的迭代器 使用 closure 可以保存迭代器所需保存的所有状态 也可以将迭...

  • Collection、泛型

    【Collection、泛型】 主要内容 Collection集合 迭代器 增强for 泛型 Collection...

  • c++学习记录8(GeekBand)

    这周的课讲了将泛型算法。现在将泛型算法收集下,备用。 (1)泛型算法用迭代器来解决第一个要求:遍历容器。所有迭代器...

  • Java学习Day08

    今日学习内容总结 Colection集合 Iterator迭代器 泛型 Collection集合 public b...

  • Java-泛型

    day02【Collection、泛型】 主要内容 Collection集合 迭代器 增强for 泛型 教学目标 ...

  • 2019-10-30

    day02【Collection、泛型】 主要内容 Collection集合 迭代器 增强for 泛型 教学目标 ...

网友评论

      本文标题:lua学习之迭代器与泛型 for 第二篇

      本文链接:https://www.haomeiwen.com/subject/avgmkhtx.html