【Lua面试】 迭代器和泛型For

Lua面试题重点提问

迭代器和闭包

迭代器Iterator:是一种可以遍历一个集合中所有元素的结构。
迭代器函数Iterator():每次调用,函数会返回“下一个”元素的数值(不是返回索引)。

闭包:可以访问自身环境中一个或多个局部变量(捕获引用环境中的变量)

迭代器和闭包的关系

调用迭代器函数,会返回下一个元素,闭包保存下一个元素的值。

创建闭包结构

创建闭包:创建一个非局部变量
闭包结构:闭包self+创建闭包机器封装变量的工厂Factory

泛型for

泛型for为了迭代而设计
一次迭代循环,泛型for内部保存了迭代函数,不需要iter
每次做新的迭代,都会再次调用迭代函数,返回nil结束迭代

闭包、迭代器、泛型for示例

在这里插入图片描述

一般不会自己去定义迭代器,而是去使用已经提供的迭代器

泛型for的语法

创建一个闭包开销可能会很大的问题
为了解决开销问题,那就使用泛型for自己保存迭代状态

泛型for保存了三个值
1个迭代函数,1个不可变状态,1个控制变量
var-list :N个变量名组成的列表,逗号隔开
exp-list:N个表达式组成的列表,通常只有一个,对迭代器工厂的调用

控制变量:var-list 变量列表第一个

for var-list in exp-list do body end
for k,v in pairs(t) do print(k,v) end 

泛型for内部流程

1.泛型for使用不可变状态和控制变量作为参数来调用迭代函数
2.迭代函数的返回值返给变量列表中声明的变量
3.如果返回nil,循环结束,否则一直循环,再次调用迭代函数

无状态迭代器

无状态迭代器:自身不保存任何状态的迭代器,多个循环中使用一个无状态循环器,避免创建闭包的开销。
一个无状态迭代器,只使用不可变变量和控制变量来为迭代生成下一个元素
典型例子是ipairs,可以迭代一个序列中的所有元素

例子:按顺序遍历表

所有的复杂性都隐藏在迭代器中实现

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_21407523/article/details/126372126