Lua学习笔记(6)——迭代器与泛型for

迭代器与closure

1.迭代器,就是一种可以遍历(iterate over)一种集合中所有元素的机制,它通常便是为函数。

返回列表中元素的值的迭代器
在泛型for中使用迭代器

2.泛型for在内部保存了迭代器函数,在每次新迭代时调用迭代器,并在迭代器返回nil时结束。

3.编写迭代器本身或许不容易,但是使用起来却很容易。

Lua学习笔记(6)——迭代器与泛型for_第1张图片
遍历单词的迭代器
使用迭代器

泛型for的语义

1.泛型for保存3个值:一个迭代器函数、一个恒定状态(invairant state)和一个控制变量(control variable)。

泛型for语法(是一个或多个变量名的列表,以逗号分隔;是一个或多个表达式的列表,同样以逗号分隔。通常表达式只有一个对迭代器工厂的调用。)
遍历表,k为索引,v为值
遍历行

2.for,先对in后面的表达式求值,然后保存表达式返回的3个值,迭代器函数、恒定状态和控制变量的初值,最后一个表达式才会产生多个结果并且只保留3个值,多余的值会被丢弃,不足的话会以nil补足。

Lua学习笔记(6)——迭代器与泛型for_第2张图片
初始化后,for会以恒定状态_s和控制变量var_n来调用迭代器函数。然后for将迭代器函数的返回值赋予变量列表中的表里。如果第一个返回值为nil那么循环中止。否则执行它的循环体,随后再次调用迭代器函数,并重复这个过程。

无状态的迭代器

1.无状态的迭代器,就是一种自身不保存任何状态的迭代器。

无状态迭代器ipairs使用
Lua学习笔记(6)——迭代器与泛型for_第3张图片
当Lua调用for循环中的ipairs(a)时,它会获得三个值:迭代函数iter、恒定状态a、控制变量的初值0。
next(t,k),该调用会以table中的任意次序返回一组值。没有下一组值是next返回nil。k值为nil时返回table的第一组值。
不通过pairs直接使用next

具有复杂状态的迭代器

1.当迭代器需要保存许多状态时,就需要使用closure。

Lua学习笔记(6)——迭代器与泛型for_第4张图片
Lua学习笔记(6)——迭代器与泛型for_第5张图片

你可能感兴趣的:(Lua学习笔记(6)——迭代器与泛型for)