Если вы не хотите встраивать функцию обратного вызова в вашу функцию, вы можете определить ее до, а затем назначить ее указанному месту назначения.
function Callback(self, a, b)
-- do your work ...
end
function CallbackUser1()
targetTable = { }
targetTable.entry = Callback
end
function CallbackUser2()
otherTargetTable = { }
otherTargetTable.entry = Callback
end
Это решение требует, чтобы аргументы всегда были одинаковыми.
Примечание: Все следующие определения идентичны
function Table:func(a, b) ... end
function Table.func(self, a, b) ... end
Table.func = function(self, a, b) ... end
Проблема в использовании Lua.
В первом случае, помните, что это:
function ih:action(text, item, state)
переводится в это:
function action(ih, text, item, state)
Так что отсутствует параметр ih.
Во втором случае listCase существует только после вызова MakeAnIupBox. Вы можете решить это, объявив функцию внутри области действия MakeAnIupBox.
Опираясь на предложение Антонио Скури, которое не было полностью явным, я решил, что код должен читать:
function MakeAnIupBox
--make some more elements here
listPlace = iup.list{}
listPlace.sort = "YES"
listPlace.dropdown = "YES"
--populate the list here
--now handle callbacks
listPlace.action = function(self, text, item, state) PlaceAction(listPlace, text, item, state) end
end
function PlaceAction(ih, text, item, state)
listAddress.REMOVEITEM = "ALL"
if state == 1 then -- a place has been selected
--code here to populate the Addresses list
end
end