tolua++: добавление функций lua в класс C++, который был экспортирован в Lua

Я использую tolua ++ для экспорта некоторых классов C++ в Lua.

Насколько я понимаю, каждый класс "внедряется" на стороне lua, как таблица lua. Мне интересно, возможно ли поэтому добавить новые (Lua) методы в таблицу объектов C++, чтобы я мог добиться эффекта добавления новых методов в класс C++.

Предположим, что я экспортирую класс Foobar.

Методы Foobar будут доступны в Lua следующим образом:

Foobar:method1()
Foobar:method2()
...

и т.п.

Я хотел бы иметь возможность добавлять новые методы (newmethod1 и newmethod2) в таблицу "объект" Foobar

У меня есть следующие вопросы:

  1. Можно ли "расширить" функциональность экспортируемого объекта C++ способом, описанным выше?
  2. Как можно добавить новые функции в таблицу 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()
Другие вопросы по тегам