function dedai(t)
local i = 0
return function()
print(i .. '最内部')
i = i + 1
return t[i]
end
end
list = {1,2,3,5,2,1}
for i in dedai(list) do
print(i)
end
在这段代码中,匿名函数访问了一个“非局部的变量”i,改变两用于保持一个计数器。出刊上去,由于创建变量i的函数(dedai)已经返回,所以之后每次调用匿名函数时,i都应该是已超出作用范围的。但其实不然,Lua会以closure的概念来正确地处理这种情况。简单地说,一个closure就是一个函数加上该函数所需访问的所有“非局部的变量”。如果再次调用dedai,那么它会创建一个新的局部变量i,从而也将得到一个新的closure。
参考:https://www.cnblogs.com/moonlightpoet/p/5684850.html
返回两个值的迭代器
function diedai2(t)
local i = 0
return function()
i = i + 1
if i > #t then
return nil
end
return i,t[i]
end
end
list = {1,2,3,5,2,1}
for i,v in diedai2(list) do
print(i,v)
end
网友评论