Lua обратный вызов в модуль - PullRequest
0 голосов
/ 08 июля 2011

Мой скрипт регистрируется для обратного вызова, используя

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

где callbackFunc - имя (строка) функции обратного вызова. Теперь я превратил этот скрипт в модуль, но обратный вызов больше не вызывается, я полагаю, потому что функция обратного вызова не входит в область действия cmodule. Как я могу решить это? (Луа новичок)

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")

1 Ответ

2 голосов
/ 09 июля 2011

Вам нужно что-то определенное в глобальном пространстве для оценки строки обратно к вызову функции.

В зависимости от того, как они реализовали 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...