#c #scripting #lua #lua-api
#c #сценарии #lua #lua-api
Вопрос:
У меня есть файл lua, который выглядит следующим образом:
tableA = {…}
tableB = {…}
tableC = {…}
Я хочу получить std::vector, который будет содержать имена всех таблиц, определенных в файле: {«TableA», «TableB», «TableC»}
Как я могу сделать это с помощью Lua C API?
Ответ №1:
У таблиц нет имен. Переменные делают. В этом случае переменные являются глобальными, поэтому имя переменной является просто ключом в таблице globals. Тем не менее, если это API, который вы пишете, то, вероятно, это плохой дизайн. Вы должны предоставить скрипту средство «регистрации» значимых значений, а не заставлять автора скрипта помещать их в определенное место.
Комментарии:
1. Я знаю о глобальной таблице, но в ней много других переменных, поэтому она не дает мне того, что я хочу. Я использую скрипты lua в качестве файлов конфигурации для персонажей, реквизита и т. Д. В моей игре. Прямо сейчас мне нужно иметь список, содержащий все имена объектов, определенных в файле сценария. Прямо сейчас я использую простой текстовый файл, в котором перечислены все объекты, которые могут быть загружены из скрипта. Было бы лучше, если бы я мог знать имена всех переменных, которые я могу загрузить из файла, имеющего список их имен.
2. Опять же, вы не должны обращаться к скрипту в поисках именованных элементов, скрипт должен сообщать вам, какие объекты у него есть. Тем не менее, вы запросили список «всех таблиц, определенных в файле», показывая пример, где эти таблицы являются глобальными. Перебирайте глобальные переменные для значений, где
type(x) == 'table'
и готово. Все же гораздо лучше позволить скрипту сообщать вам о сущностях по значению , а не по имени.3. Спасибо, я думаю, этого будет достаточно. Кстати, что вы имеете в виду, говоря «пусть скрипт сообщает вам о сущностях по значению, а не по имени»? Предположим, у меня есть некоторая сущность с именем «car», например. Мне нужно загрузить его из скрипта. Но мне нужно знать, из какого файла я могу его загрузить. Поэтому было бы очень удобно перебрать все файлы скриптов и создать std::pair<std::string,std::vector<std::string>> где первая строка — это имя файла, а вектор — список всех объектов, определенных в файле, чтобы я мог легко найти нужный скриптпозже.
4. У вас есть вызов вашего скрипта
RegisterEntity("car", ...)
Entity { foo=bar}
илиCar { foo=bar }
илиconfig("car", ...)
илиconf("car") { foo=bar }
или любой из миллиона других способов, которыми вы можете захотеть упорядочить вещи так, чтобы скрипт сообщал вам , где находится конфигурация для конкретного объекта, а не вместо того, чтобы ваш код C копался в объектах, созданных скриптом, ища его.5. @winch Скрипт компилируется как тело функции. Он может возвращать список значений любой длины (ов). Вам просто нужно соглашение о том, что возвращать: это может быть объект; Это может быть функция, которая создает объект; Это может быть таблица с определенными полями. (Это еще один из «миллионов способов».)
Ответ №2:
Чтобы получить имена случайных глобальных переменных, созданных во время выполнения файла скрипта, вам нужно будет использовать environment games для запуска скрипта в вашем собственном «глобальном» контексте.
Если вы можете изменить скрипт, было бы намного проще заставить его возвращать таблицы (или только их имена) вызывающему скрипту.