欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Lua的闭包详解(转)

程序员文章站 2022-03-14 11:00:43
...

为了便于更好地理解,例子进行了修改。首先要了解几个概念和知识点:

  1. 词法定界:当一个函数内嵌套另一个函数的时候,内函数可以访问外部函数的局部变量,这种特征叫做词法定界。
  2. lua当中函数可以是一个值,它可以存在变量中,可以作为函数参数,可以作为返回值。
  3. 闭包:通过调用含有一个内部函数加上该外部函数持有的外部局部变量(upvalue)的外部函数(就是工厂)产生的一个实例函数
  4. 闭包组成:外部函数+外部函数创建的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

闭包就是一个拥有属性,可以修改属性,并保留属性状态的函数

原文出处:https://www.cnblogs.com/zzy-frisrtblog/p/5864209.html

相关标签: Lua

上一篇: Lua对字段进行排序

下一篇: Lua笔记