当前位置: 首页 > 编程笔记 >

Lua中的迭代器浅析

岳允晨
2023-03-14
本文向大家介绍Lua中的迭代器浅析,包括了Lua中的迭代器浅析的使用技巧和注意事项,需要的朋友参考一下

今天学习的内容还蛮有意思的,让我兴奋了一下~

1.迭代器

什么是迭代器?别傻了,我最讨厌的就是名词解释了,反正就是用来遍历集合的一种方式。
比如,我们最常用的pairs,如下代码:


    local t = {"fdsd", "445"};

   

    for k, v in pairs(t) do

        print("k=" .. k .. ", v=" .. v);

    end


 
这是一次遍历table的操作,然后打印出table的key值和value值。
输出结果如下:

[LUA-print] k=1, v=fdsd

[LUA-print] k=2, v=445

2.自己写一个迭代器

要想了解迭代器,那还是要自己写一个才行,迭代器没有什么神奇的地方,它很简单。如这样一个函数:


function dieDaiQi(t)

    local i = 0;

    return function()

        i = i + 1;            

        return t[i];

    end

end

这函数故名思议,叫做迭代器,英文不好的也没关系,知道是这意思就好了,呵呵(小若:英文你个头啊!分明是拼音啊!)
 
有没有发现这dieDaiQi函数有点特别?没错,它就是之前的文章提到过的“闭合函数”,正是利用了闭合函数的特性来实现迭代功能的。
来看看如何使用这个迭代器吧:


    local iter = dieDaiQi(t);

    while true do

        local value = iter();

        if value == nil then

            break;

        end

       

        print(value);

    end

因为每一次调用dieDaiQi函数,就会产生一个新的闭合函数,所以我们要用一个iter变量保存这个闭合函数,避免重复创建。

如果你对闭合函数已经很生疏了,可以看看我之前的这篇文章:【笨木头Lua专栏】基础补充03:闭合函数、非全局函数与函数的尾调用

接着,只要循环调用iter闭合函数即可,因为闭合函数的特点,i变量是会一直增加的,所以每次调用iter函数,返回的都是下一个table元素。
最终输出结果如下:


[LUA-print] fdsd

[LUA-print] 445

3.更简洁的迭代器调用

刚刚调用迭代器的方式也太粗暴了,这么长一片代码,不太合理。
所以,我们又有了偷懒的方式——使用for循环调用迭代器。
 
直接看代码,刚刚的迭代器可以这么调用:


    local t = {"fdsd", "445"};

    for value in dieDaiQi(t) do

        print(value);

    end


 
这里大家可能会有一个疑问,每一次的循环,都会调用一次dieDaiQi函数,那不就会产生很多个闭合函数?那i的值不就每次都是0?

答案是:不会的。

因为for循环只会调用一次dieDaiQi函数,然后把它的返回值保存起来。

4.结束

这篇的介绍似乎是异常地简短,其实不是的,还有下篇,因为我怕接下来要说的东西比较多,导致文章太长。

所以,还是分开来介绍吧,下一篇,我们来深入了解一下为什么for循环可以这么方便地处理迭代器。

 类似资料:
  • 主要内容:泛型 for 迭代器,实例,无状态的迭代器,实例,实例,多状态的迭代器,实例迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。 在 Lua 中迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素。 泛型 for 迭代器 泛型 for 在自己内部保存迭代函数,实际上它保存三个值:迭代函数、状态常量、控制变量。 泛型 for 迭代器提供了集合的 key/value 对,语法格式如下: 上面代码中,

  • 迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址 在Lua中迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素。 泛型 for 迭代器 泛型 for 在自己内部保存迭代函数,实际上它保存三个值:迭代函数、状态常量、控制变量。 泛型 for 迭代器提供了集合的 key/value 对,语法格式如下: for k, v

  • 本文向大家介绍浅谈python迭代器,包括了浅谈python迭代器的使用技巧和注意事项,需要的朋友参考一下 1、yield,将函数变为 generator (生成器) 例如:斐波那契数列 2、Iterable 所有可以使用for循环的对象,统称为 Iterable (可迭代) 3、Iterator 可以使用next() <__next__()> 函数调用并且不断返回下一个值的对象成为 Iterat

  • 本文向大家介绍Lua 迭代表,包括了Lua 迭代表的使用技巧和注意事项,需要的朋友参考一下 示例 Lua标准库提供pairs了对表的键和值进行迭代的功能。使用进行迭代时pairs,即使表的键是numeric,也没有指定的遍历顺序。 对于使用数字键的表,Lua提供了一个ipairs功能。该ipairs函数将始终从table[1],table[2]等等进行迭代,直到nil找到第一个值。 请注意,ipa

  • 本文向大家介绍浅析Python迭代器的高级用法,包括了浅析Python迭代器的高级用法的使用技巧和注意事项,需要的朋友参考一下 跳过开头 首先是跳过开始部分,这个在我们读取文本的时候最常用。在实际的应用当中,比如记录的日志或者是代码等等,一般来说头部都会附上一段说明,或者用注释标注或者是用特殊的符号标记。这些信息是给用到数据的程序员看的,当我们通过代码获取数据的时候,显然是希望可以过滤掉这些信息的

  • 本文向大家介绍Lua中的for循环和迭代器的秘密探究,包括了Lua中的for循环和迭代器的秘密探究的使用技巧和注意事项,需要的朋友参考一下 上一篇我们介绍了,可以使用for循环来完成迭代器的调用,十分简洁。 那么,具体这for循环做了什么呢?我当然没有去看源码,我只是看书而已。 资料来源于《Lua程序设计》第二版,如果这本书的内容没有错的话,那么,本篇文章理论上也不会有错~ 1.返回两个值的迭代器