Lua_泛型for与迭代器

原创 2015年07月07日 20:50:20

本篇主要是记录了小编在学习lua程序设计中关于泛型for和迭代器的内容的理解和遇到的问题。

迭代器

        迭代器:就是一种可以遍历一种集合中所有的元素的机制(例如C++中的foreach等),并且每次调用函数,返回集合中的“以一个”元素。为了能够实现这目的,因此每个迭代器都需要在每次成功调用之间保持一些状态。恰好,closure通常就是解决这些而产生的。closure就是一种可以访问其外部嵌套环境中的局部变量的函数。

function values(t)   --values是创建该closure的工厂函数
  local i = 0
  return function()   --function()函数就是一个closure
              i = i + 1   
             return t[i]   --closure将它的状态保存在其外部变量i、t中
          end
end

泛型for

        提出背景:由于上面的迭代器生成方式有一个严重的缺点,在每次循环调用时都会创建一个新的closure,产生了一些开销;因此,通过for的自身来保存迭代器的状态,这些状态有迭代器函数、恒定状态、控制变量。     

for  <var_list>  in <exp_list> do  --var_list:变量列表;exp_list:表达式列表
    --body
end
        for做的第一件事就是对in后面的表达式求值,并且在对表达式求值的过程中,表达式会返回三个值分别是迭代函数、恒定状态、控制变量的初值,并且这三个值会被for保存。
a={12,13}
local function iter(m, i)
	i = i +1
	local v = m[i]
	if v then
		return i, v
	end
end
function ipa(a)  --ipa就是就是表达式
	return iter, a, 0   --返回迭代函数、恒定状态(a)、控制变量初值
end

泛型for:
for i, v in ipa(a) do
	print(i, v)
end


重点:对for循环处理过程分解:
do
  local _f,_s,_var = ipa(a)  --分别是iter,a,0
    while true do
      local _var1,_var2 = _f(_s,_var) --返回的是上面i,v(1,a[1])
      _var = _var1  --控制变量为1
     if _var==nil then  --当迭代器函数的第一个返回值为nil,跳出循环
         break
     end
       <block>  --每次循环的操作(如:上面的print(i,v))
    end
end

输出测试:
1    12
2    13


为了验证上面的说法,下面我们直接采用for循环将其输出:
for i=1, 2,1 do
    t,m,n = ipa(a)
    print(t(a,0))
    print(m,n)
end
输出结果:
1    12     --print(t(a,0))
table: 00D43098    0     --print(m,n)
1    12
table: 00D43098    0

小结:
   通过上面程序,可以发现我们的迭代器函数iter并没有创建closure,因此通过for循环调用迭代器函数发现每次输出的内容是一样的。因此主要的迭代工作是落在了泛型for的上面。


  

相关文章推荐

对lua泛型for迭代器一些理解

个人对lua for迭代器一下理解

《lua程序设计》读书笔记 第七章:迭代器与泛型for

7.1 迭代器与closure“迭代器”就是一种遍历一种集合中所有元素的机制,在Lua中,通常将迭代器表示为函数,没调用一次函数,便返回集合中的“下一个”元素。closure为迭代器提供了绝佳的支持,...

Lua学习笔记 第七章 迭代器与泛型for

7.1 迭代器与closure 所谓迭代器就是一种可以遍历一种集合中所有元素的机制;在Lua中,通常将迭代器表示为函数; 每调用一次函数即返回集合中的下一个元素; closure(闭合函数)...

Lua中的迭代器和泛型for学习总结

Lua中的迭代器和泛型for学习总结 作者:果冻想 字体:[增加 减小] 类型:转载 这篇文章主要介绍了Lua中的迭代器和泛型for学习总结,本文讲解了迭代器和泛型for的基础知识、泛型fo...

Lua迭代器和泛型for)

1. 迭代器与Closure:     在Lua中,迭代器通常为函数,每调用一次函数,即返回集合中的“下一个”元素。每个迭代器都需要在每次成功调用之间保持一些状态,这样才能知道它所在的位置和下一次遍...

Lua_第 7 章 迭代器与泛型 for

迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素。在 Lua 中我们 常常使用函数来描述迭代器,每次调用该函数就返回集合的下一个元素。 迭代器需要保留上一次成功调用的状态和下一...

Lua 迭代器与泛型for

note 目录 迭代器与闭包(closure) 泛型for的语义 无状态迭代器 具有复杂状态的迭代器 真正的迭代器 1:迭代器与闭包(closure)迭代器就是一种可以遍历一种集合中所有元素的机制。迭...

6.lua学习笔记:迭代器和for泛型

1. 迭代器与Closure:     在Lua中,迭代器通常为函数,每调用一次函数,即返回集合中的“下一个”元素。每个迭代器都需要在每次成功调用之间保持一些状态,这样才能知道它所在的位置和下一次遍...

Lua学习笔记-迭代器和泛型for

使用迭代器例子: --list迭代器,返回list中 function values( t ) local i = 0; local n = table.getn(t)--table中元...
  • ljp1919
  • ljp1919
  • 2016年02月15日 14:22
  • 370

Lua 学习笔记(六) —— 迭代器和泛型for

今天开始died 一、迭代器就是遍历集合的元素 二、泛型for语句 首先,for对in后面的表达式求值,表达式返回迭代器函数、恒定状态和控制变量的初值给for 保存。 然后,for会...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Lua_泛型for与迭代器
举报原因:
原因补充:

(最多只允许输入30个字)