Как реализовать (анонимные) функции обратного вызова Lua для любого количества объектов Lua (таблиц)? - PullRequest
0 голосов
/ 23 февраля 2012

У меня есть "объекты" в Lua, которые используют таблицу для поддержания своего набора данных и функций. Простой пример:

obj = {func = function(self) print(self) end}

Может быть любое количество объектов.

Теперь у меня есть функция C registerObject(obj), которая должна каким-то образом сохранять ссылку на этот объект Lua (таблицу obj), чтобы иметь возможность вызывать функцию func этого конкретного объекта (и других) позднее. Это означает, что у меня нет имени для таблицы объекта, мне нужно как-то сохранить ссылку на саму таблицу.

Как я могу заставить эту работу? Пример C ++ также приемлем, на самом деле функция C - это просто интерфейс, который создает класс Objective-C для каждого объекта.

Ответы [ 2 ]

2 голосов
/ 23 февраля 2012

Таблицы Lua передаются по ссылке, поэтому они всегда являются «анонимными», а ссылки на них хранятся в переменной. Я бы просто положил все ваши "предметы" в таблицу как это:

objects={}
function registerObject(obj)
    objects[#objects+1]=obj
end
a={func=function(self) return(self.data) end, data='foo'}
b={func=function(self) return(self.data) end, data='bar'}
registerObject(a)
registerObject(b)
for k,v in pairs(objects) do
    print("Object",k,"data:",v:func())
end

Следует помнить одну вещь: это запрещает сбор этих таблиц, поскольку в таблице объектов всегда есть ссылка на объекты, если вы явно не удалили ее. Это может или не может быть то, что вы хотите. Если вы не хотите, чтобы таблица объектов вмешивалась в сборку мусора, вы можете установить для ее записи __mode в метатаблице значение 'v' для слабых значений. Таким образом, ссылки на объект в таблице объектов не учитываются; если значение в таблице объектов является единственной оставшейся ссылкой на объект, объект будет собран (см. Программирование на Lua для получения дополнительной информации).

0 голосов
/ 24 февраля 2012

Реестр . Мне больше нечего сказать

...