Как я могу получить список всех имен таблиц в скрипте .lua, используя Lua C API?

#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 для запуска скрипта в вашем собственном «глобальном» контексте.

Если вы можете изменить скрипт, было бы намного проще заставить его возвращать таблицы (или только их имена) вызывающему скрипту.