Я пытаюсь реализовать нотацию объектов в скриптах Lua.Вот что мне удалось сделать с C API:
Я создал новую глобальную таблицу «Test» как класс и добавил в нее поле «new», указывающее на функциюнаписано на C, т.е. я могу сделать это в коде lua: "local obj = Test.new ()" (вызывает функцию "new")
"новая" функция C создаети возвращает новую таблицу, и регистрирует функции в ней как поля (например, «add», «count» ...), т.е. я могу сделать это: «obj: add (« mike »)» и «obj: count ()»(obj передается в качестве первых аргументов с нотацией ":")
2 вопроса:
1) Все работает, как и ожидалось, но мне интересно вот что: В чем преимущество использования метатаблицы в моем случае?Я вижу везде, что метатаблицы могут помочь мне достичь того, что я пытался сделать, но я не понимаю, где они будут полезны?Добавление полей в таблицы как методы не правильно?Как метатаблицы могут помочь мне (если они добавлены как метатаблицы моих таблиц)?
2) На самом деле я пытаюсь воспроизвести поведение C ++ в Lua здесь.Например, когда я пишу это в C ++: «Test * obj = new Test ();»Я ожидаю, что C ++ и конструктор Test вернут мне указатель экземпляра Test.Это именно то, что я пытаюсь сделать для меня Lua.
Дело в том, что в этом случае я использую таблицу в качестве возврата «new», но не указатель, поэтому я могу вызывать методы дляпозже с Lua (используя его поля), как стандартный объект C ++ (с оператором ->).
Чтобы иметь возможность получить фактический указатель моего класса в функциях C, я добавил поле "ptr "(light uservalue) в таблицу, возвращаемую" new ".Без него я мог бы манипулировать только таблицей Lua в моей функции C, и ничего более (поэтому больше не нужно вызывать методы для реального указателя).
Мой второй вопрос: правильный ли это способсделай это?У вас есть идея, как можно манипулировать моим указателем везде без этого поля "ptr"?
Спасибо,
Николас.