zoukankan      html  css  js  c++  java
  • Lua学习(5)——迭代器与泛型for

    1. 迭代器

    2. 泛型for语义

    所谓迭代器就是一种可以遍历一种集合中所有元素的机制。在lua中,迭代器通常表示为函数,每调用依次函数就返回集合中的下一个元素。泛型for 内部保存了迭代器函数

    实际保存了3个值:1个迭代器函数,一个恒定状态(invariant state)和一个控制变量(control variable),泛型for语法如下:

    for <var-list> in <exp-list> do
        <body>
    end

    简单的例子ipairs()

    tb={10,20,40}
    for i,v in ipairs(tb) do  
        print(i,v)
    end
    1       10
    2       20
    3       40

    自己实现一个迭代器mypairs(tb) 内部使用closure函数,遍历到最后一个元素,返回nil,nil

    function mypairs(tb)
      local i = 0
      return function() 
        i=i+1
        v = tb[i]
        if v then
          return i, v
        else
          return nil,nil
        end
      end
    end
    
    tb={20,30,40,50,60}
    for i,v in mypairs(tb) do
         print(i,v)
    end
    
    1       20
    2       30
    3       40
    4       50
    5       60

    4. 无状态迭代器

    指的是自身不保存任何状态的迭代器。在每此迭代中,for循环都会用恒定状态和控制变量来调用迭代其函数,一个无状态的迭代器可以根据这两个值为下一次迭代生产下一个元素。ipairs就是这样的迭代器

     local function iter(a,i)
       i=i+1
       local v=a[i]
       if v then
         return i,v
       end
     end
     
     function mypairs2(a)
       return iter ,a,0
     end
     
     tb={20,30,40,50,60}
     
     for i,v in mypairs2(tb) do
       print(i,v)
     end
                                                                  
    [cloud@cloud3 luapro]$ lua hello.lua 
    1       20
    2       30
    3       40
    4       50
    5       60

    pairs函数与ipairs函数一样,不同是pairs使用lua内部基本遍历函数next

    function pairs(t)
      return next,t,nil
    end

    也可以直接使用next函数

    for k,v in next,tb do
      print(k,v)
    end

    状态迭代器另一个例子是链表迭代器

    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链表的建立,起始list为nil,第一node输入时,val=line,node1的next指向list(nil),然后list指向node1;第二个节点重复这个过程

    node2的next指向list(node1),然后list指向node1。 list->node2->node1->nil。 list就是node2

    --初始化链表中的数据。
    list = nil
    for line in io.lines() do
        line = { val = line, next = list}
    end
    
    --以泛型(for)的形式遍历链表。
    for node in traverse(list) do
        print(node.val)
    end
  • 相关阅读:
    关于用户、用户组及文件权限的试题
    lvm-简介
    项目中用到的jar包简介(1)
    Centos7开启SSH服务
    2.docker架构,原理,安装及简单应用
    如何平滑将注册中心从Eureka迁移到Nacos?
    8.k8s连载--重新生成k8s token(kubeadm join报错及解决)
    7. 复制k8s Node节点 并重新初始化k8s-nodes2节点 (k8s连载)
    6. k8s + jenkins 实现持续集成(完)
    5.k8s基本命令汇总
  • 原文地址:https://www.cnblogs.com/oldtrafford/p/3819980.html
Copyright © 2011-2022 走看看