2013-12-11 2 views
4

Я новичок в Lua и пытаюсь понять некоторые из основ. Что-то, что я хочу понять, является связыванием Lua с экземплярами C++.Lua/C++ привязка с нуля

Я не заинтересован в сторонних библиотек, я хочу, чтобы понять это на более фундаментальном уровне - спасибо :)

Вот мои вопросы:

  1. Мое предположение основано на том, что я прочитал , заключается в том, что Lua может связываться только со статическими функциями C. Это верно?
  2. Означает ли это, что для привязки экземпляра класса C++ мне сначала нужно написать статические функции для каждого метода и свойства getter/setter, которые я хочу, принимая указатель экземпляра в качестве параметра.
  3. Я бы зарегистрировал эти функции с помощью Lua.
  4. Я передал бы Lua указатель на экземпляр класса C++.
  5. От Lua я бы назвал одну из зарегистрированных функций, передав указатель экземпляра C++.
  6. Статическая функция разыгрывает указатель, вызывая эквивалентный метод.

Имеет ли это смысл? Или я сделал что-то неправильно?

Спасибо, что прочитали это.

+0

Связывание разных языков обычно осуществляется через интерфейс C (ABI лучше определен для C). Я не достаточно знаком с lua, чтобы узнать подробности, но мой совет - выбрать библиотечное решение. Вы собираетесь изобретать колесо, и, возможно, нет ничего странного в том, чтобы заставить его быть таким же круглым, как существующие решения.По крайней мере, взгляните на то, что делают эти библиотеки. –

+1

Спасибо, но я специально пытаюсь понять принципы Lua для использования, где я не хочу (не допускается) использовать сторонние библиотеки. Я просмотрел несколько библиотек, но меня интересуют только основные принципы, как это работает, и не могли понять это из библиотек (очень абстрактное, тяжелое чтение). – user1654794

+0

Многие сторонние библиотеки, которые используют привязки Lua-C++, являются open source. Вы всегда можете посмотреть, как они делают вещи, чтобы понять их. * Предостережение emptor * хотя. –

ответ

5

Это прямо у моего союзника.

1) Lua ... на самом деле это не связано с вещами, что вам нужно сделать, это «хорошо поиграть с Lua», и это требует немного узнать о том, как работает Lua.

Я ДЕЙСТВИТЕЛЬНО предлагаю прочитать http://luaforge.net/docman/83/98/ANoFrillsIntroToLua51VMInstructions.pdf что.

Это говорит о том, что ВСЁ ЛУА действительно может это сделать. Таким образом, функции Lua позволяют вам манипулировать только этими структурами.

После этого все имеет смысл.

Почему этот ответ должен закончиться здесь

Ваши вопросы после того, как 1 все неправильно. и 1 является семантически неправильным, статическая функция имеет только внутреннюю/слабую связь. Я думаю, вы имеете в виду «не метод»

2) Не совсем, помните, что у вас есть эта симпатичная «я»/«эта» идентичность с объектами (и lua с таблицами/мета-таблицами) - вы не привязываетесь к методы.

Вы хотите, чтобы Lua вызывал какую-то свою функцию с аргументом «я», что «я» (что бы это ни было, простой целочисленный идентификатор или пустота *, если вы чувствуете себя опасно) должен сказать вам, что ojbect, с которым вы работаете.

3/4/5/6 на самом деле не имеет смысла, прочитайте этот документ :) комментарий в ответ на это, если вам нужно больше или иметь что-то более конкретно, это не плохой вопрос кстати это просто наивно

+0

Привет, Алек, спасибо за ответ. Я знаком с тем, как Луа работает вообще; связь через стек и таблицы и метаданные для хранения/организации данных. Я думаю, может быть, проблема в моей терминологии о привязке. Я хочу, чтобы Lua вызывал функцию на экземпляре C++. «вы хотите, чтобы Lua вызывал какую-то свою функцию с аргументом« я », что« я »должен сказать вам, с каким ojbect вы работаете». Да, точно - так как я могу достичь этого, должен ли я создавать статические функции C++, которые принимают void * и разыгрывают его, а затем вызывать эквивалентный метод на экземпляре C++? – user1654794

+1

@ user1654794 это зависит от вас, помните, если вы решитесь на void * way, используйте dynamic_cast, вы будете удивлены тем, как часто неудачи не вызывают сбоев. Почему бы не __look__ в учебниках или кодах других библиотек. Вот как я узнал. –

+0

OK отлично - спасибо Алек. Моя основная забота заключалась в том, что этот подход не был хорошим, или он был недоволен. С вашего ответа я немного уверен в том, что просто запускаю код и вижу, что происходит :) Спасибо за подсказку dynamic_cast. Отличная идея для тестирования указателей, исходящих из Lua, - это правильные типы. :) Еще раз спасибо! – user1654794