Как узнать, что доступно в среде lua? - PullRequest
2 голосов
/ 27 сентября 2010

В наши дни во многих играх доступно несколько сценариев lua, но это повсеместно недокументировано.

Допустим, я могу заставить игру запустить мой скрипт lua (это lua 5.1) - и сценарий может записать найденное в текстовые файлы на диске. Сколько я могу узнать о среде, в которой выполняется скрипт?

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

Большинство языков предоставляют некоторые функции отражения, которые можно использовать здесь - сколько это возможно во встроенной среде lua?

Ответы [ 2 ]

1 голос
/ 28 сентября 2010

Стандартная библиотека «debug» имеет несколько функций, которые могут оказаться полезными:

  • debug.getfenv - Возвращает окружение объекта.
  • debug.getinfo - возвращает таблицу с информацией о функции.
  • ... и более

Справочное руководство Lua также гласит:

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

Так что с отладочной библиотекой вы можете получить доступ к большему.

1 голос
/ 28 сентября 2010

К сожалению, вы мало что можете узнать о функциях в Lua - они по своей конструкции принимают любое количество параметров.Без возможности взглянуть на источники ваш единственный способ - это документация и / или другие примеры.

В этом случае вы можете в большинстве случаев рекурсивно обходить всю таблицу _G и выводить каждую таблицу / функцию, печатаярезультаты в файл.

«Ошибка обычно приводит к сбою на рабочем столе» - признак действительно плохого дизайна - хороший API должен сказать вам, что он ожидает A, и вы передали B. Например, в Lqt , привязка Qt к Lua, мы проверяем каждый параметр на соответствие исходному API Qt, чтобы программист получал уведомления об ошибках:

> QApplication.setFont(1, 2)
QApplication::setFont(number, number): incorrect or extra arguments, expecting: QFont*,string,.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...