【问题标题】:Lua callback into moduleLua回调到模块
【发布时间】:2011-07-10 17:54:40
【问题描述】:

我的脚本使用

注册自己的回调
require "cmodule"
index = 1
cmodule.RegisterSoftButtonDownCallback(index, "callbackFunc")

其中 callbackFunc 是回调函数的名称(字符串)。现在我把这个脚本变成了一个模块,但是回调不再被调用,我假设是因为回调函数不在 cmodule 的范围内。我该如何解决这个问题? (Lua 新手)

cmodule 是具有 Lua 绑定的设备驱动程序。

编辑:我的完整解决方案基于以下 BMitch 的回答:

require "cmodule"
local modname = "myModule"
local M = {}
_G[modname] = M
package.loaded[modname] = M
local cmodule = cmodule
local _G = _G
setfenv(1,M)

function callbackFunc()
    -- use module vars here
end
_G["myModule_callbackFunc"] = callbackFunc
index = 1
cmodule.RegisterSoftButtonDownCallback(index, "myModule_callbackFunc")

【问题讨论】:

  • 什么是cmodule?这不是 Lua 5.1 的一部分。它从何而来?是全局变量还是局部变量?
  • cmodule 是具有 Lua 绑定的设备驱动程序。我在脚本的开头做了一个require“cmodule”(加载cmodule.dll)。它不是我开发的。如果知道它到底是做什么很重要,我可以尝试联系作者。

标签: module callback lua


【解决方案1】:

您需要在全局空间中定义一些内容,以便将字符串评估回函数调用。

根据他们如何实现RegisterSoftButtonDownCallback,您可能会卡在定义函数本身,而不是像myModule.callbackFunc 这样的表/字段组合。为了尽量减少命名空间污染,如果你不能使用myModule.callbackFunc,那么我建议myModule_callbackFunc=myModule.callbackFunc 或类似的东西。所以你的代码看起来像:

require "cmodule"
index = 1
myModule_callbackFunc=myModule.callbackFunc
cmodule.RegisterSoftButtonDownCallback(index, "myModule_callbackFunc")

为了更好地解决问题,我将与 cmodule 开发人员合作,让他们的程序接受函数指针而不是字符串。那么您的代码将如下所示:

require "cmodule"
index = 1
cmodule.RegisterSoftButtonDownCallback(index, myModule.callbackFunc)

【讨论】:

  • 谢谢,这让我走上了正轨。我会将我的解决方案添加到原始问题中,以便其他人可以从中受益。如果您认为它可以改进,请发表评论。
猜你喜欢
  • 1970-01-01
  • 2013-04-09
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
相关资源
最近更新 更多