• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >Lua > Lua中的for循环和迭代器的秘密探究

Lua中的for循环和迭代器的秘密探究

作者: 字体:[增加 减小] 来源:互联网

通过本文主要向大家介绍了Lua中的迭代器浅析等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

上一篇我们介绍了,可以使用for循环来完成迭代器的调用,十分简洁。
那么,具体这for循环做了什么呢?我当然没有去看源码,我只是看书而已。
资料来源于《Lua程序设计》第二版,如果这本书的内容没有错的话,那么,本篇文章理论上也不会有错~

1.返回两个值的迭代器

pairs是能遍历table的key和value的,而我们之前写的dieDaiQi函数只能返回value。
所以,我们要改改dieDaiQi函数,如下:
function dieDaiQi(t)
    local i = 0;
    return function()
        i = i + 1; 
      
        if i > #t then
            return nil;
        end         
        return i, t[i];
    end
end
</div>

当然了,这不是一个安全的迭代器,我们假设table中没有nil值。
至于为什么要有一个if i > #t的判断,待会会说到。
 
使用如下方式调用迭代器:
    local t = {"fdsd", "445", "9999"};
    for k, v in dieDaiQi(t) do
        print(k .. "," .. v);
    end
</div>

输出结果如下:
[LUA-print] 1,fdsd
[LUA-print] 2,445
[LUA-print] 3,9999
</div>

2.for .. in .. do的真面目

【for k, v in dieDaiQi(t) do  end】这段代码实际上等价于以下代码:
    do
        local _f, _s, _var = dieDaiQi(t);
      
        while true do
            local k, v = _f(_s, _var);
            _var = k;
          
            if _var == nil then
                break;
            end
          
            print(k .. "," .. v);
        end
    end
</div>

是不是很复杂?其实它和我们之前第一次调用迭代器的代码很像,我们先删掉复杂的部分,代码变成如下:
    do
        local _f = dieDaiQi(t);
      
        while true do
            local k, v = _f();
          
            if k == nil then
                break;
            end
          
            print(k .. "," .. v);
        end
    end
</div>

试试运行这段代码,结果如下:
[LUA-print] 1,fdsd
[LUA-print] 2,445
[LUA-print] 3,9999
</div>
和直接使用for in循环是一样的结果。
 
实际上,我说的这些都是废话,因为我们之前就已经说,for in循环就是用来简化迭代器的调用的,所以当然是一样的结果。

3.迭代器函数、恒定状态、控制变量初值

我们来看看for in真面目的第一句代码:local _f, _s, _var = dieDaiQi(t);
三个返回值分别代表迭代器函数(_f)、恒定状态(_s)、控制变量初值(_var)。
 
迭代器函数:就不用解释了,就是我们的dieDaiQi返回的闭合函数。
恒定状态:其实就是一个变量,这个变量一直不变,所以称之为恒定。
控制变量初值:和恒定相对于的,这是一个会不断改变的变量。
 
因为我本人没有实际使用过这种特性,所以没法举出实际的例子,只能从理论上去解释。

1.比如我们的dieDaiQi函数,它只有一个返回值,就是那个闭合函数,所以,_s和_var都是nil。

2.接着调用local k, v = _f(_s, _var); 这实际上就是调用了闭合函数,并且将恒定值和变量值都作为参数传递进去。

3.Lua的函数是很自由的,即使_f函数本身没有参数,也可以传参数进去,不会影响什么,所以,两个nil值传进去了,没有任何事情发生,就像是直接调用_f()一样。

4.再下一句代码:_var = k;  这是把闭合函数(_f)的第一个返回值保存起来,因为每次调用闭合函数(_f)返回值都是下一个迭代值,所以_var每次都是不一样的值。

5.如果_var的值为nil,则停止循环,结束迭代。
 
因此,我们编写迭代器的时候,迭代结束的方式就是让第一个返回值为nil。
 
那么,如果我们让dieDaiQi函数返回恒定状态和控制变量初值,又是什么样的情况呢?
代码如下:
function dieDaiQi(t)
    local i = 0;
    return function(s, var)
        i = i + 1; 
      
        if i > #t then
            return nil;
        end       
        print("恒定值=" .. s .. ", 变量值=" .. var)
        return i, t[i];
    end, 10, 0
end
</div>

留意一下,dieDaiQi函数现在会返回三个参数,后面的10和0分别就是恒定状态和控制变量初值。
同时,闭合函数也多了两个参数:s和var。
 
于是,我们再次用for循环遍历迭代器:

您可能想查找下面的文章:

相关文章

  • Lua面向对象编程之类的简单实现方式
  • Lua中的动态链接实例
  • Lua协同程序(COROUTINE)运行步骤分解
  • Lua中使用二维数组实例
  • Lua与C语言间的交互实例
  • Lua多行注释和取消多行注释的方法
  • Lua极简入门指南(三): loadfile和错误处理
  • Lua中遍历文件操作代码实例
  • Lua中的全局变量、非全局变量总结
  • Lua模拟面向对象示例分享

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • Lua编程示例(八):生产者-消费者问题
    • Lua性能优化技巧(一):前言
    • Lua中table的遍历详解
    • Lua中调用C++函数示例
    • Lua教程(二):C++和Lua相互传递数据示例
    • Lua教程(十四):字符串库详解
    • 使用Lua来扩展C++程序的方法
    • Lua math.fmod使用时的小数问题
    • Lua函数与字符串处理简明总结
    • Lua中的loadfile、dofile、require详解

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有