最新要闻
- 【环球新视野】3女生拎3斤米酒进站被拦一饮而尽!网友:王宝强听了都头疼
- 天天短讯!比亚迪海豚上演高速路“全自动驾驶” 车主躺后排睡觉
- 每日视点!击败《流浪地球2》!《满江红》成票房冠军:张艺谋大儿子出演 游客排长队打秦桧雕像免票逛岳飞庙
- 自建“出海舰队” 比亚迪花了50亿元买的船:长这模样
- 日本原装进口!雀巢黑咖啡大促:6毛8能泡一杯
- 当前焦点!夏普发布新款PV800UL激光投影仪:亮度高达8000ANSI流明
- 观点:还买啥车!美国人车贷都还不起了 拖欠率比金融危机峰值还高
- 中国反击!新增7项先进科技禁止/限制出口 合计达139项
- 每日短讯:真刺鸡战场!西安一景区设免费抓鸡活动:人鸡比例10:1
- AMD YES!来自小厂的迷你主机 把友商按在地上摩擦
- 世界看点:你敢坐吗?日产汽车联手日立:通过电动汽车为电梯临时供电
- 湖南以前叫什么名字?湖南旅游十大必去景区
- 南菱嫣盛霆旭是什么小说?2023年言情小说推荐
- 创造营2019全部成员有哪些?创造营2019出道成员
- 雪见是哪个电视剧的人物?雪见是哪个演员扮演的角色?
- 不要抛下绮绮是什么意思?王者荣耀流行梗有哪些?
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
【网关开发】6.lua绑定委托(delegate)实现多播调用
(资料图片仅供参考)
目录- 背景
- 实现原理
- 实现细节
- 应用
- 测试
- 思考与总结
背景
在程序开发过程中有时会遇到事件流的问题,某一个结果会触发A、B、C等一系列动作。需要将各种事件注册给委托类(Delegate)。Delegate类会依次触发注册的函数,完成相应的动作。
实现原理
lua中可以使用元表和队列的形式进行实现
实现细节
delegate.lua
local _M = { }local _MT = { __index = _M }local setmetatable = setmetatablelocal table_remove = table.remove-- _invoke_list 注册队列-- _count 注册计数function _M.new() return setmetatable({ _invoke_list = { }, _count = 0 }, _MT)end-- __call 函数实现function _MT:__call(...) local _invoke_list = self._invoke_list for i = 1, self._count do _invoke_list[i](...) endend-- 增加local function add_delegate(self, cb, ...) if not cb then return self end local _invoke_list = self._invoke_list local idx = self._count + 1 self._invoke_list[idx] = cb self._count = idx return add_delegate(self, ...) -- 递归添加end-- 会检查是否已经注册local function add_delegate2(self, cb, ...) if not cb then return self end local _invoke_list = self._invoke_list for i = 1, self._count do if _invoke_list[i] == cb then -- already exists, skip return add_delegate2(self, ...) end end local _invoke_list = self._invoke_list local idx = self._count + 1 self._invoke_list[idx] = cb self._count = idx return add_delegate2(self, ...)endlocal function remove_delegate(self, cb, ...) if not cb then return self end local _invoke_list = self._invoke_list for i = 1, self._count do if _invoke_list[i] == cb then table_remove(_invoke_list, i) self._count = self._count - 1 break end end return remove_delegate(self, ...)endlocal function is_empty(self) return self._count == 0end_M.__add = add_delegate_M.__sub = remove_delegate_M.invoke = _MT.__call_M.add_delegate = add_delegate_M.add_delegate2 = add_delegate2_M.remove_delegate = remove_delegate_M.is_empty = is_emptyreturn _M
应用
-- 测试函数local function delegate_test1(data) ngx.log(ngx.INFO,"delegate_test1 "..data)endlocal function delegate_test2(data) ngx.log(ngx.INFO,"delegate_test2 ".. data)endlocal function init() watcher = delegate.new() watcher:add_delegate2(delegate_test1) watcher:add_delegate2(delegate_test2) watcher("test")end
测试
思考与总结
整个实现就是一个简单列表和对列表的操作,很好理解。结合场景实现一些广播功会更加方便。
-
每日视点!击败《流浪地球2》!《满江红》成票房冠军:张艺谋大儿子出演 游客排长队打秦桧雕像免票逛岳飞庙
击败《流浪地球2》!《满江红》成票房冠军:张艺谋大儿子出演游客排长队打秦桧雕像免票逛岳飞庙
来源: 【网关开发】6.lua绑定委托(delegate)实现多播调用
【环球新视野】3女生拎3斤米酒进站被拦一饮而尽!网友:王宝强听了都头疼
天天短讯!比亚迪海豚上演高速路“全自动驾驶” 车主躺后排睡觉
每日视点!击败《流浪地球2》!《满江红》成票房冠军:张艺谋大儿子出演 游客排长队打秦桧雕像免票逛岳飞庙
自建“出海舰队” 比亚迪花了50亿元买的船:长这模样
日本原装进口!雀巢黑咖啡大促:6毛8能泡一杯
当前通讯!看个小说竟然像在照镜子!
数据库容灾等级
后端跨域问题导致java.io.IOException: UT010029: Stream is closed解决办法
当前焦点!夏普发布新款PV800UL激光投影仪:亮度高达8000ANSI流明
观点:还买啥车!美国人车贷都还不起了 拖欠率比金融危机峰值还高
中国反击!新增7项先进科技禁止/限制出口 合计达139项
MySQL索引底层探究
热头条丨感受 Vue3 的魔法力量
每日短讯:真刺鸡战场!西安一景区设免费抓鸡活动:人鸡比例10:1
AMD YES!来自小厂的迷你主机 把友商按在地上摩擦
世界看点:你敢坐吗?日产汽车联手日立:通过电动汽车为电梯临时供电
湖南以前叫什么名字?湖南旅游十大必去景区
南菱嫣盛霆旭是什么小说?2023年言情小说推荐
创造营2019全部成员有哪些?创造营2019出道成员
雪见是哪个电视剧的人物?雪见是哪个演员扮演的角色?
不要抛下绮绮是什么意思?王者荣耀流行梗有哪些?
大金空调是哪个国家的品牌?大金空调不制热怎么回事?
环球快消息!【如何提高IT运维效率】深度解读京东云基于NLP的运维日志异常检测AIOps落地实践
环球实时:别再写狗屎代码了,推荐这 5 款 IDEA 插件,让你的代码质量直接起飞!
将实体光盘制作成光盘映像iso文件
输入法切换不了是什么原因?输入法切换不了怎么解决?
小米6x什么时候发布的?小米6x详细参数
qq游戏大厅在哪里打开?qq游戏大厅怎么多开?
注册表编辑器是干什么的?注册表编辑器怎么恢复默认设置?
【当前热闻】《流浪地球2》周边众筹已超4500万!最初目标仅仅10万
中国“宁王”成功出海 宁德时代首座海外工厂投产
全球头条:springboot~logback按level添加不同的颜色
春节假期有车走应急车道 视频车拍照举报还得数百元红包奖励
环球百事通!最勤劳“小兔子”行驶1500米、数据940GB!玉兔二号传回新玉照
当前热讯:中国玩家的电子阳痿:被日本“老中医”彻底治好了
聚焦:读Java8函数式编程笔记03_高级集合类和收集器
【天天快播报】男子与女友吵完架开车2分钟扣22分 逆行、闯红灯等:网友看完害怕
最新:男子春节逆向旅游深圳承包整片沙滩:通过房价得出判断
中国春节档电影市场重焕活力:总票房破67亿 列历史第2
头条焦点:AX9000安装使用Docker
天天看点:理想L9高速“失灵” 追尾“自杀式并线”车引争议:车主自找的?
车企年度销量目标完成率:比亚迪一枝独秀 长城、长安惨不忍睹
今日热议:唯一/普通索引的选择?change buffer
焦点消息!AMD RX 400/500老显卡尴尬不能跑新游戏:同时代N卡却没问题
当前视点!暗物质:宇宙中最神秘的物质之一 已经逼疯科学家了
环球观天下!RabbitMQ介绍
图省钱去开电动汽车:在美国根本不存在
天天快资讯丨玩法BT!真人版《鱿鱼游戏》出意外:多人受伤
世界速看:MQ的相关概念
Python字符串
当前关注:女子过年练车坠河:一家3人不幸遇难 还是大学生
环球快播:学习笔记——安卓的下载路径;创建一个空的安卓project;Android中的日志工具划分
滚动:史上最好Windows系统!微软要对Win11首个正式版强制升级22H2了
【全球报资讯】马斯克称中国竞争对手最努力最聪明:最有可能仅次于特斯拉
每日快讯!Cybertruck又跳票了!特斯拉首款电动皮卡量产要等到2024年
2022手机战事骁龙精彩收官:新的好戏要开场了!
全球微头条丨Codeforces Round #601 (Div. 2) A-E
世界快报:敏感肌适用 露得清氨基酸洗面奶19.9元白菜价:3.3折狂促
全球要闻:POJ 1185 炮兵阵地
每日动态![概率论与数理统计]笔记:4.3 常用的统计分布
通讯!刘德华吴京《流浪地球2》电影里重回20岁 吴京:没有被年轻俊美吓到吧
【天天新要闻】2G/3G退网 怎就这么难
【环球速看料】[NOIP2016提高组] 愤怒的小鸟
焦点速看:33.98万元起买吗?理想L7内部空间图公布:感受一下到底有多能装
男子花20多万三亚度假遭遇节约型爸妈 网友热议:过度节约才是更大浪费
全球热点!操作系统的概念、功能和目标
今日热讯:阿里回应将在新加坡建“第一高楼”当全球总部:出生在杭州 生长在杭州 发展在杭州
中国团队开发液体机器人成功越狱:复刻《终结者2》T-1000名场面
密钥封装和公钥加密的联系和区别?
环球观热点:将awk脚本写在文件里:一种高效的awk循环循环方式
【世界播资讯】男子在鱼疗池睡着“生吞”小鱼 网友:鱼生从未体验的味道
要闻速递:国航航班颠簸下坠乘客录视频遗言以防不测:全飞机的人都在尖叫
学习笔记——redis数据类型(ZSet)
世界微速讯:这几个月的二手车 可能是最香的
Hexo 修改默认文章路径
【世界热闻】-53℃的漠河启动i9-13900K、RTX 4090!魔幻一幕出现
当前热点-男孩逛景区遇现实版“鹈鹕灌顶”:小心确实有攻击性
Educational Codeforces Round 1
动态焦点:女儿返程点千元外卖塞满父母冰箱:感恩双亲 过去他们把我行李箱装满
【世界新视野】顽皮狗总监:《神秘海域》不会再出了
环球速看:Windows开发的瑞士军刀,NewSPYLite发布
当前最新:学习笔记——redis中的数据类型(List、Set、Hash)
信息:【算法训练营day27】LeetCode39. 组合总和 LeetCode40. 组合总和II LeetCode131. 分割回文串
【环球新要闻】windows2003 的安装以及安装时遇到的问题
世界焦点!大规模实测199颗i9-13900KS:6GHz的秘密找到了!真神仙
天天信息:PS5 Edge手柄续航差原因找到了:电池容量缩水1/3
首款支持NVIDIA RTX I/O秒进游戏的大作终于来了!但是平均帧率降了10%
每日速看!家长带三胞胎爬五指山 三大三小全被困:21小时才救出来
全球微资讯!希捷搞定50+TB硬盘!但还得等3年
《流浪地球2》火爆 吴京恳请大家不要再宣传300亿票房:会觉得内疚
20年前 1个啤酒瓶能卖5毛钱 为什么在没人收了?
焦点速读:狗狗走丢一个月回家疯狂撞门:为啥土狗能找到回家的路 宠物狗却不能?
门店359元:鸿星尔克腾蛇2.0老爹鞋149元大促
读Java8函数式编程笔记02_流
苹果在三大战场向谷歌发起“无声战斗”:让iOS远离Android
全球动态:支付宝接口的数字签名
全球头条:连Intel都难逃寒冬:美国加州部门裁员数百人
自行车数量比人口还多 荷兰水下自行车库启用:比汽车车库还豪华
世界简讯:孩子抱走小狗还给大狗磕了3个头 剧情反转没血缘关系:网友调侃白磕