Lua中闭包的理解

之前在公司项目中,遇到关于Lua闭包的问题,一直不是很能理解,在阅读了许多优秀的博客之后,稍微能够理解这个概念,于是把这些东西按照自己的思路整理出来,以便加深记忆和理解

对于闭包的理解:
function fn()
    local i = 0
    return function()     -- 注意这里是返回函数的地址,不是执行
       i = i + 1
        return i
    end
end

c1 = fn()                      -- 接收函数返回的地址
print(c1())                    --> 1          --c1()才表示执行
--local i = 0的意思是重新创建一个新的变量,这里没有创建新的?
print(c1())                    --> 2

--再次调用fn,将创建一个新的局部变量i
c2 = fn()
print(c2())  -->1
print(c1())  -->3
print(c2())  -->2

闭包在Lua中是一个非常重要的概念,闭包是由函数和与其相关的引用环境组合而成的实体。闭包=函数+引用环境。子函数可以使用父函数中的局部变量,这种行为叫做闭包。lua中函数是一种类型,可以被存放在变量或者数据结构中,可以当做参数传递给另一个函数,也可以是一个函数的返回值,也可以在运行期间被创建。Lua中还有一个非局部变量的概念,可以理解为不是在局部作用范围内定义的一个变量,同时,它又不是一个全局变量,也就是大家说的upvalue。这种变量主要应用在嵌套函数和匿名函数中(这个变量的环境就是前面说的引用环境)。在Lua函数中再定义函数,称为内嵌函数,内嵌函数可以访问外部函数已经创建的所有局部变量,而这些变量就被称为该内嵌函数的upvalue(upvalue实际指的是变量而不是值),这些变量可以在内部函数之间共享。于是成全了Lua中闭包。

function Closure()
	local ival = 10           	--upvalue
	function InnerFun1()     	--内嵌函数
		print(ival)
	end

	function InnerFun2()
		print("Before",ival)
		ival = ival + 10
		print("After", ival)
	end

	return InnerFun1, InnerFun2
end

--将函数赋值给变量,此时变量a绑定了函数InnerFun1,b绑定了函数InnerFun2
local a, b = Closure()

--调用a
a()

--调用b
b()

下面是项目中头像的实现部分代码,由于头像的加载方式使用了组件复用,新成员头像加载出来可能是旧玩家的头像,在解决这个问题的时候,就涉及到了lua中的闭包知识

function MemberCell:SetIconImage()
	local role_id = self.data.uid    
	local function download_callback(path)
		if nil == self.raw_img_obj or IsNil(self.raw_img_obj.gameObject) then
			return
		end
		if self.data.uid ~= role_id then
			return
		end
		-- role_id
		local avatar_path = path or AvatarManager.GetFilePath(role_id, true)
		self.raw_img_obj.raw_image:LoadSprite(avatar_path,
		function()
			if self.data.uid ~= role_id then
				return
			end
		 	if self.show_image then
				self.show_image:SetValue(false)
			end
		end)
	end
	CommonDataManager.NewSetAvatar(role_id, self.show_image, self.image_res, self.raw_img_obj, self.data.sex, self.data.prof, true, download_callback)
	CommonDataManager.SetAvatarFrame(role_id, self.head_frame_res, self.show_default_frame)
end
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值