基于OpenComputers(MC 1.12.2 Forge)与Lua 5.3,如何在目标协程内部获取自身协程名称
在OpenComputers中实现协程自身名称获取与消息过滤
在OpenComputers(Minecraft 1.12.2 Forge环境,基于Lua 5.3)里,默认Lua协程并没有内置的名称属性,要实现你需要的「协程内部获取自身名称、过滤目标消息」的功能,这里有两种实用方案:
方案一:创建协程时直接传入名称(简洁推荐)
这种方式通过封装协程创建函数,把名称直接传递给协程内部的执行逻辑,逻辑直观且无需额外维护全局状态:
-- 封装带名称的协程创建工具函数 function createNamedCoroutine(name, func) -- 将名称作为第一个参数传递给协程执行函数 return coroutine.create(function() func(name) end) end -- 创建名为"co1"的协程 local co1 = createNamedCoroutine("co1", function(coroutine_name) local evt, _, _, nm, arg1 = event.pull("thread_msg", 2) -- 只处理目标名称匹配当前协程的消息 if nm == coroutine_name then print(string.format("协程%s收到消息:事件=%s,参数=%s", coroutine_name, evt, arg1)) end end) -- 启动协程 coroutine.resume(co1) -- 发送指定目标的thread_msg事件 event.push("thread_msg", "co1", "这是发给co1的测试内容")
这个方案的核心是把协程名称作为参数注入到协程内部,让协程可以直接拿到自身标识,和event.push发送的目标名称做对比,只处理属于自己的消息。
方案二:全局表映射协程与名称(灵活扩展)
如果你希望协程函数的签名不需要修改,可以维护一个全局表来存储协程对象到名称的映射:
-- 全局表:存储协程对象到名称的对应关系 local coroutineNameMap = {} -- 带名称的协程创建函数 function createNamedCoroutine(name, func) local co = coroutine.create(func) coroutineNameMap[co] = name -- 可选:协程结束时自动清理映射,避免内存泄漏 local wrappedFunc = function() func() coroutineNameMap[co] = nil end return coroutine.create(wrappedFunc) end -- 获取当前协程名称的工具函数 function getCurrentCoroutineName() local currentCo = coroutine.running() return coroutineNameMap[currentCo] end -- 创建并使用协程 local co1 = createNamedCoroutine("co1", function() local coroutine_name = getCurrentCoroutineName() local evt, _, _, nm, arg1 = event.pull("thread_msg", 2) if nm == coroutine_name then print(evt, arg1) end end) coroutine.resume(co1) event.push("thread_msg", "co1", "")
这种方式通过coroutine.running()获取当前执行的协程对象,再从全局表里查到对应的名称。优点是协程函数无需额外接收参数,但要记得在协程结束时清理映射表条目,防止内存泄漏。
两种方案都能满足你的需求,考虑到你的场景比较简单,方案一的直接传参方式更轻便,推荐优先使用。
内容的提问来源于stack exchange,提问作者Andrew lua
相关产品推荐
相关产品推荐

