Lua学习笔记08:无状态的迭代器(迭代器与泛型for-02)
无状态迭代器:一种自身不保存任何状态的迭代器。因此,我们可以在多个循环中使用同一个无状态的迭代器,避免创建新的closure 开销。(在一个迭代器方法中,其return直接返回一个或多个值,而不是在return后面创建一个新的函数)
在每次迭代中,for循环都会用恒定状态和控制变量来调用迭代器函数。一个无状态的迭代器可以根据这两个值来为下次迭代生成下一个元素。这类迭代器的一个典型例子就是ipairs,它可以用来迭代一个数组的所有元素。
例:
a = {"one", "two", "three"}
for i, v in ipairs(a) do
print(i, v)
end
-------------------------------
--迭代器函数
local function iter(a, i)
i = i + 1
local v = a[i]
if v then return i,v end
end
--表达式列表<exp-list>
function ipairs(a)
return iter, a, 0---------->iter(a,0)
end
a = {"one", "two", "three"}
for i,v in ipairs(a) do
print(i, v)
end
--------------------------------
1、函数pairs 与ipairs 类似,也是用于遍历一个table中的所有元素。不同的是,它的迭代函数是Lua中的一个基本函数next。
function pairs(t)
return next, t, nil----------->next(t,k)----->t为一个table,k为该table的字段(索引)名
end
2、Lua会自动将for循环中的表达式列表中的结果调整为3个值(迭代器、恒定状态、控制变量)
例:
abc={"asd","adsf","asf"}
for i,v in next,abc do
print(v)
end
其结果与一下方法调用一致:
for i,v in paire(abc) do
print(v)
end
3、 关于无状态迭代器的另一个有趣例子是一种可以遍历链表的迭代器:
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 = nil
for line in io.lines() do
list = {val = line, next = list}
end
for node in traverse(list) do
print(node.val)
end
- 利用lua中的closure来实现lua迭代器以及用泛型for实现lua的无状态迭代器
- Lua学习笔记09:复杂状态的迭代器(迭代器与泛型for-03)
- Lua_泛型for与迭代器
- 每日一Lua(5)-迭代器与泛型for
- lua学习之迭代器与泛型for第一篇
- lua中的泛型for 和迭代器
- lua学习之迭代器与泛型 for 第二篇
- Lua学习笔记(七):迭代器与泛型for
- Lua迭代器和泛型for)
- Lua学习笔记-迭代器和泛型for
- lua学习之迭代器与泛型 for 第三篇
- Lua中的迭代器和泛型for介绍
- Lua迭代器与泛型for
- lua语言-《lua程序设计》6~7章函数和迭代器与泛型for
- Step By Step(Lua迭代器和泛型for)
- 六、Lua中的迭代器与泛型for
- Step By Step(Lua迭代器和泛型for)
- Lua学习(七)-----迭代器和泛型for
- Lua笔记7-迭代器和泛型for
- 二、Lua迭代器与泛型for