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
--表达式列表
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学习笔记,lua)