Да, есть возможность добавить новые методы в существующий экспортируемый класс.
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()
для запуска метода1 в экземпляре. - method2 () - Вызовите как
Foobar:method2()
для запуска метода 2.
Однако tolua ++ на самом деле не использует два разныхтаблицы (одна для методов, которые должны быть присоединены к самому классу, а другая для методов экземпляра этого класса).Вместо этого он объединяет их вместе, поэтому можно запускать Foobar:method1()
и instance:new()
... даже при том, что методы не должны использоваться.Таким образом, нет никакой разницы между тем, как используются статические методы и как методы экземпляра.Синтаксически это тоже самое.(Я лично чувствую, что это проблема с tolua ++.)
Если вы ищете пример, вот как вы должны вызывать эти функции из lua:
obj = Foobar:new()
print( obj:method1() )
obj:delete()