• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Lua学习(5)——迭代器与泛型for

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

 

 

 

 

 

 

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
安装nginx+lua开发环境发布时间:2022-07-22
下一篇:
lua解析树形字符串拼接问题发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap