Lua的闭包详解(转)
程序员文章站
2022-03-14 11:00:43
...
为了便于更好地理解,例子进行了修改。首先要了解几个概念和知识点:
- 词法定界:当一个函数内嵌套另一个函数的时候,内函数可以访问外部函数的局部变量,这种特征叫做词法定界。
- lua当中函数可以是一个值,它可以存在变量中,可以作为函数参数,可以作为返回值。
- 闭包:通过调用含有一个内部函数加上该外部函数持有的外部局部变量(upvalue)的外部函数(就是工厂)产生的一个实例函数
- 闭包组成:外部函数+外部函数创建的upvalue+内部函数(闭包函数)
例子:list_iter ()是一个迭代table的迭代器(再加个循环就是完整的)
function list_iter (t)
local i = 0
local n = table.getn(t)
return function() --内部匿名函数可以访问外部函数的i和n,
i = i + 1 --函数作为返回值, 这里的i也叫外部局部变量,就是lua中的upvalue
if i <= n then
return t[i]
end
end
end
闭包中的upvalue各自独立,调用一次test()就会产生一个新的闭包
function test()
local i=0
return function()
i = i + 1
return i
end
end
c1=test()
c2=test() --c1,c2是建立在同一个函数,同一个局部变量的不同实例上面的两个不同的闭包
print(c1()) -->1
print(c1()) -->2 --重复调用时每一个调用都会记住上一次调用后的值,就是说i=1了已经
print(c2()) -->1 --闭包不同所以upvalue不同
print(c2()) -->2
闭包就是一个拥有属性,可以修改属性,并保留属性状态的函数
上一篇: Lua对字段进行排序
下一篇: Lua笔记