lua中的bind函数,闭包函数,终于知道有啥用处了

-- 闭包绑定
function Bind(self, func, ...)
	assert(self == nil or type(self) == "table")
	assert(func ~= nil and type(func) == "function")
	local params = nil
	if self == nil then
		params = SafePack(...)
	else
		params = SafePack(self, ...)
	end
	return function(...)
		local args = ConcatSafePack(params, SafePack(...))
		func(SafeUnpack(args))
	end
end

-- 回调绑定
-- 重载形式:
-- 1、成员函数、私有函数绑定:BindCallback(obj, callback, ...)
-- 2、闭包绑定:BindCallback(callback, ...)
function BindCallback(...)
	local bindFunc = nil
	local params = SafePack(...)
	assert(params.n >= 1, "BindCallback : error params count!")
	if type(params[1]) == "table" and type(params[2]) == "function" then
		bindFunc = Bind(...)
	elseif type(params[1]) == "function" then
		bindFunc = Bind(nil, ...)
	else
		error("BindCallback : error params list!")
	end
	return bindFunc
end

比如我们有多个button需要注册click的回调函数,那么怎么区分回来的是哪个button呢?
我么可以继承Button函数,重写其OnPointerClick方法,在回调的时候将this传递过来:

在这里插入图片描述

--注册回调函数
self.loginBtnComp = self.loginBtn.gameObject:GetComponent(typeof(CS.PButton))
self.loginBtnComp:RegisterClickCallback(OnClickLoginButton)

function OnClickLoginButton(button)
	print("click")
	print(button)
end

另外一种方法,是使用闭包的方式:

self.loginBtnComp = self.loginBtn.gameObject:GetComponent(typeof(CS.PButton))
local callback = Bind(self, OnClickButton, self.loginBtnComp)
self.loginBtnComp:RegisterClick(callback)

local function OnClickButton(self, button)
	print("click button")
end

这里的Bind就是生成一个闭包函数,使得回调来的时候,能记得之前的上下文中的参数params:
在这里插入图片描述
这样的好处是,我们不需要再继承一个Button了。

何时释放闭包:

参考:
https://www.cnblogs.com/unityzc/p/10317129.html

如果在lua中保存了闭包,则要在lua中进行赋值为nil。
如是临时local的,注册到C#中了,那么要销毁的时候,要将C#中的回调函数赋值为null。

local callback = Bind(self, OnClickButton, self.loginBtnComp)
self.loginBtnComp:RegisterClick(nil)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值