tolua++: добавление функций lua в класс C++, который был экспортирован в Lua
Я использую tolua ++ для экспорта некоторых классов C++ в Lua.
Насколько я понимаю, каждый класс "внедряется" на стороне lua, как таблица lua. Мне интересно, возможно ли поэтому добавить новые (Lua) методы в таблицу объектов C++, чтобы я мог добиться эффекта добавления новых методов в класс C++.
Предположим, что я экспортирую класс Foobar.
Методы Foobar будут доступны в Lua следующим образом:
Foobar:method1()
Foobar:method2()
...
и т.п.
Я хотел бы иметь возможность добавлять новые методы (newmethod1 и newmethod2) в таблицу "объект" Foobar
У меня есть следующие вопросы:
- Можно ли "расширить" функциональность экспортируемого объекта C++ способом, описанным выше?
- Как можно добавить новые функции в таблицу Foobar? (Я относительно новичок в Lua)
1 ответ
Да, есть возможность добавить новые методы в существующий экспортируемый класс.
Foobar - это простая таблица, поэтому вы можете прикреплять к ней методы, как и к любой другой таблице. [1]
Foobar["extra_method"] = function (self, arg1, arg2) print(arg1, arg2) end
и теперь вы можете сделать:
Foobar:extra_method(1,2)
а также 1 2
будет отображаться.
[1] tolua++ работает несколько странно. Он создает одну основную таблицу для каждого класса, которую вы видите как Foobar, которая содержит обе статические функции-члены класса (например, Foobar:new()
) и функции-члены экземпляра класса (например, что Foobar:method1()
скорее всего есть). :
оператор в lua - синтаксический сахар; a:b()
преобразуется в a.b(a)
, Это значит, когда вы звоните Foobar:new()
, транспонируется в Foobar:new(Foobar)
, Таким образом self
Аргументом является таблица Foobar. Когда вы создаете объект типа Foobar, а затем вызываете method1() для него, self
будет этот объект. Таким образом, добавление нового метода method3
к таблице Foobar позволит вам сделать Foobar:method3()
а также obj = Foobar:new(); obj:method3()
, хотя первый выдаст ошибку. Таким образом, этот ответ работает только для tolua++.
Изменить: для адреса комментария
Позвольте мне использовать реальный код здесь. Итак, давайте предположим, что у нас есть объявление класса Foobar, которое выглядит так:
class Foobar {
public:
void method1();
static void method2();
};
Когда tolua++ сгенерирует код привязки lua для этого класса, он даст вам таблицу со следующими методами
- new() - Позвонить как
Foobar:new()
создать экземпляр Foobar. - delete () - позвонить как
instance:delete()
уничтожить экземпляр Foobar. - method1() - вызов как
instance:method1()
запустить method1 на экземпляре. - method2 () - вызов как
Foobar:method2()
запустить метод2.
Однако в tolua++ фактически не используются две разные таблицы (одна для методов, которые должны быть присоединены к самому классу, а другая для методов экземпляра этого класса). Вместо этого он объединяет два, так что можно запустить Foobar:method1()
а также instance:new()
... даже при том, что методы не должны использоваться. Таким образом, нет никакой разницы между тем, как используются статические методы и как методы экземпляра. Синтаксически это тоже самое. (Я лично чувствую, что это проблема с tolua++.)
Если вы ищете пример, вот как вы должны вызывать эти функции из lua:
obj = Foobar:new()
print( obj:method1() )
obj:delete()