避免在 Lua 中使用全局变量并使用特定回调机制
2018-8-19 17:28:59
收藏:0
阅读:122
评论:1
我想要使用一个 Lua API,该 API 在事件发生时具有特定的回调函数,例如当 TCP 包到达时。首先,该函数必须被注册,但需要使用函数名称作为字符串,如下面的示例代码所示
function __init__()
local dstport = 4681
local dstIP = "192.168.1.42"
-- 注册回调函数
register_tcp_handler('tcp_package_handler', dstIP, dstPort)
end
-- 回调函数
function tcp_package_handler(srcIP, srcPort, dstIP, dstPort, payload)
-- 检查有效载荷或重置看门狗
end
希望回调函数提供给调用者其他变量,例如看门狗计时器或其他对象。
我能想到的最简单的方法是将 extravariables 设置为全局变量,但我认为这是最不优雅的方式。如果我可以直接传递函数,则闭包会有所帮助,但我不能。我必须使用函数名称作为字符串。
考虑到这个机制,有没有更优雅的方法向回调函数提供变量而不使它们成为全局变量?
编辑:像这样使用闭包
function closure_tcp_package_handler(srcIP, srcPort, dstIP, dstPort, payload, packagecounter, timerobject)
function tcp_package_handler(srcIP, srcPort, dstIP, dstPort, payload)
-- 做一些事情,更改 packagecounter,timerobject
end
return 'tcp_package_handler'
end
并将此函数使用两次进行注册,例如使用 'packagecounter1,timerobject1' 和 'packagecounter2,timerobject2',只有最后一对参数会被更改。
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

你在处理回调基础架构问题。在这种情况下,你的代码不是调用处理程序的代码。因此,没有办法隐藏那些参数;如果你可以改变它们,那么有访问处理程序所在模块的其他人也可以改变它们。
当然,这并不意味着它们必须是全局的。你可以把它们作为一个表的成员。如果你想确保它们只获取某些参数,甚至可以提供设置器函数来设置参数。
它的简单形式如下:
local handler_params = {} function tcp_package_handler(srcIP, srcPort, dstIP, dstPort) -- 检查 `handler_params.payload` end -- 使 `handler_params` 可供外部修改如何实现最后一个部分完全取决于你。你可以把它变成一个全局的,但如果它在某个模块中,最好将其作为该模块表的成员。同样,如果你想对谁可以访问它以及如何访问它进行一些控制,可以使用设置器函数:
function tcp_handler_set_payload(payload) handler_params.payload = payload end