Lua / SWIG переносят пользовательские данные из Lua - PullRequest
0 голосов
/ 18 мая 2010

Я пользуюсь swig-lua. У меня есть функция в Lua, которую я вызываю, и она возвращает мне указатель (userdata). сейчас я знаю, что это за указатель, но как я могу сказать Луа изнутри Луа?

Ответы [ 3 ]

3 голосов
/ 18 мая 2010

Из справочного руководства Lua :

setmetatable (таблица, метатабельный)

Устанавливает метатабельный для данной таблицы.(Вы не можете изменить метатабель других типов из Lua, только из C.)

Вы не можете "сказать Lua", что такое userdata в Lua.Ему нужно дать метатабельный или манипулировать с помощью вызовов связанных функций с использованием C API.См. главу 28.1 Программирование на Lua (Pil) для получения дополнительной информации.

0 голосов
/ 19 мая 2010

Сообщите SWIG о типе данных, на который указывает указатель void. Если SWIG знает о типе, то он передаст его Lua как userdata с подходящей метатабельной привязкой, которая позволяет стороне Lua получать доступ и изменять отдельные поля данных (и, если это класс, вызывать call, его методы) *. 1003 *

Это может означать информирование SWIG о некоторых типах данных, которые в противном случае не требуются библиотеке, но, вероятно, в долгосрочной перспективе стоят усилий.

Все, что Lua знает о типе пользовательских данных, содержится в его метатаблице. Два значения userdata имеют одинаковый тип, если они имеют одинаковую метатабельность. Этот metatable отвечает за передачу всего доступа к своему контенту со стороны Lua и обычно состоит из методов, реализованных в C, так что это возможно сделать. Без такой метатабельности сторона Lua может рассматривать userdata только как непрозрачный шарик.

0 голосов
/ 18 мая 2010

Само определение пользовательских данных состоит в том, что Lua не знает, не может и не хочет знать, что это такое. Это ваши данные - что это ваша проблема. Если вы хотите манипулировать этим, то вы должны вызывать с ним функции C (перегрузки операторов доступны с помощью метатабельных настроек).

...