--迭代器与closure
function values(t)
local i = 0
return function()
i=i+1
return t[i]
end
end
--values被称为工厂,通过它返回的闭合函数,而闭合函数中非局部的i在一次赋值后又不会消失,所以就实现了迭代器
t={1,2,3,4,5,6}
for v in values(t) do
print(v)
end
--读单词 用到两个库函数string.find() string.sub() 以及io.read()可以读取一行的内容
--注意:string.find()有两个返回值,可以利用多重赋值解决,进而得到一个单词的开始位置s和结束位置e
--'%w+'是描述一个单词的模式
function allwords()
local line = io.read()
local pos = 1
return function()
while line do
local s,e = string.find(line,'%w+',pos)
if s then
pos = e+1
return string.sub(line,s,e)
else
line = io.read()
pos = 1
end
end
return nil
end
end
for v in allwords() do
print(v)
end
--泛型for的语义
--控制变量
for v in allwords() do
print(v)
end
--v就是控制变量
--实质上泛型for等价于一个while循环的块
--一开始会产生f迭代器函数 s恒定状态 和v0控制变量的初值
--然后,v1 = f(s,v0) v2 = f(s,v1) v3 = f(s,v2) ,..., vn=f(s,vn-1)
--无状态的迭代器其实就是利用一个
--工厂和迭代函数消除了closure
--即不需要在每一个循环都开一个closure
--典型例子pairs和ipairs
--1.pairs
function iter(t,i)
i = i+1
local v = t[i]
if v then
return i,v
end
end
function pairs(t) --工厂,返回迭代器函数,恒定变量和控制变量初值
return iter,t,0
end
t={1,2,3,4,5,6,7,8,9}
for k,v in pairs(t) do
print(v)
end
for k,v in next,t do
print(v)
end
--总结一下用closure与无状态迭代器
--1.写法 pairs 为例
--closure写法
function pairs(t)
local i = 0
return function()
i = i+1
if t[i] then
return i,t[i]
end
end
end
t = {5,6,7,8,9}
for k,v in pairs(t) do
print(k,v)
end
--无状态迭代器写法
function iter(t,i)
i = i+1
if t[i] then
return i,t[i]
end
end
function pairs(t)
return iter,t,0
end
for k,v in pairs(t) do
print(k,v)
end
--比较:closure每写一个用到它的for循环就要开一个closure,从性能上讲
--不用closure的更为高效,但 closure书写起来更加方便
本文详细介绍了 Lua 中的迭代器和闭包,包括 values 函数创建的迭代器、读取单词的 allwords 函数、泛型 for 的语义以及 pairs 函数的两种实现方式——使用闭包和无状态迭代器。通过示例代码,阐述了闭包在迭代器中的作用以及无状态迭代器在性能上的优势。
6847

被折叠的 条评论
为什么被折叠?



