метатаблица для OnInit

Страницы: 1
RSS
метатаблица для OnInit
 
Код
function a(s)
    message(s)
end

Oni nit = {}
mt = { __call = a}
setmetatable(OnInit, mt)

--OnInit("a") 
Хотел на колбеки (например возмем OnInit) повесить метатаблицy и обнаружил что квик не хочет их вызывать.
Код выше в теории должен при старте скрипта вызвать a(). но он просто завершается
Но если принудительно вызвать OnInit("a") все работает. В чем подвох?
 
Цитата
Антон написал:
Код
   function  a(s)
     message (s)
 end 

Oni nit  =  {}
mt  =  { __call  =  a}
setmetatable(OnInit, mt)

 --OnInit("a")    
Хотел на колбеки (например возмем OnInit) повесить метатаблицy и обнаружил что квик не хочет их вызывать.
Код выше в теории должен при старте скрипта вызвать a(). но он просто завершается
Но если принудительно вызвать OnInit("a") все работает. В чем подвох?
в реализации qlua. Таково ее природное свойство.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Quik, скорее всего, перед вызовом пользовательских колбеков проверяет, чтобы в переменной (с зарезервированным именем колбека) хранилась ссылка именно на функцию.
В вашей реализации получается, что в переменной с зарезервированном именем OnInit хранится ссылка на таблицу. Вот Quik ее и не вызывает.
Что Вам мешает сделать просто OnI nit = a?
 
Цитата
Алексей написал:
Quik, скорее всего, перед вызовом пользовательских колбеков проверяет, чтобы в переменной (с зарезервированным именем колбека) хранилась ссылка именно на функцию.
В вашей реализации получается, что в переменной с зарезервированном именем OnInit хранится ссылка на таблицу. Вот Quik ее и не вызывает.
Что Вам мешает сделать просто OnI nit = a?
Пример только для проверки метатаблиц. Написал чтоб упростить вопрос.

Берем любую c-функцию(любая сигнатура). Создаем объект-обертку для нее на userdata.
К userdata добавляем метатаблицу с __call чтоб луа мог вызывать функцию(обычную int(lua_state*) в которой идет вызов обертки и далее уже нормальной функции.
Ну и __gc для ручного вызова деструктора у объекта-обертки.
Есть и другие варианты, через lightuserdata например. но тогда приходится в dll придется хранить список с указателями на эти обертки и чистить при выгрузке.

Вопщем я думал вариант с userdata и метатаблицами вполне стандартная возможность lua и странно что в qlua для колбеков это делать нельзя.
Я не так давно разбираюсь с этим языком, возможно я тут вообще не прав и нельзя какие то базовые функции так переопределять.(поправте если кто вкурсе, s_mike например говорит что это именно в qlua так)

Временно сделал конешно по другому но хотелось бы прояснить, это моя недоработка или в qlua.
 
В QLua, как и в обычном Lua все эти "изыски" прекрасно работают. Единственное, с чем эти номера не проходят, это с колбеками QLua. Причину я уже назвал выше: Quik перед вызовом проверяет, что в переменной (с зарезервированным именем колбека) содержится ссылка именно на функцию (видимо как-то так, переводя этот код на Lua: If OnTrade and type(OnTrade) == "function" then OnTrade(trade) end).
Вы же пытаетесь в зарезервированное имя колбека записать ссылку на таблицу или пользовательские данные (получится type(OnInit) == "table" или type(OnInit) == "userdata" и т.п.).
Что Вам мешает сделать так:
function OnInit()
 MyOnInit()
end
MyOnInit = {}
ну и далее все, что Вы хотели сделать с OnInit делайте с MyOnInit.
 
Хотелел именно так. Вся работа будет внутри dll. Скрипт делает только require.
Я переделал на передачу адреса объекта через lightuserdata, ничем не хуже только память чистить самому.

Дописав немного функционал убедился что созданный таким образом колбек(через userdata+metatable) также не вызывается будучи переданным в функцию SearchItems.
Ну и похоже везде эта проверка на то что в переменной функция.

Раз это не работает только для колбеков qlua, то просьба поправить qlua чтобы была такая возможность. (вызов пользовательский колбеков qlua как метатаблиц с __call)
Страницы: 1
Читают тему
Наверх