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

У меня есть файл lua, который выглядит так:

tableA = {…}
tableB = {…}
tableC = {…}

Я хочу получить std::vector, который будет содержать имена всех таблиц, определенных в файле: {tableA, tableB, tableC}

Как я могу сделать это с помощью Lua C API?


person Elias Daler    schedule 29.06.2014    source источник


Ответы (2)


Таблицы не имеют имен. Переменные делают. В этом случае переменные являются глобальными, поэтому имя переменной является просто ключом в таблице глобальных переменных. Тем не менее, если это API, который вы пишете, то, вероятно, это плохой дизайн. Вы должны предоставить сценарию средства «регистрации» значимых значений, а не заставлять автора сценария размещать их в определенном месте.

person Mud    schedule 29.06.2014
comment
Я знаю о таблице глобальных переменных, но в ней много других переменных, поэтому она не дает мне того, что я хочу. Я использую lua-скрипты в качестве файлов конфигурации для персонажей, реквизита и т. д. в своей игре. Сейчас мне нужен список, содержащий все имена сущностей, определенных в файле скрипта. Прямо сейчас я использую простой текстовый файл, в котором перечислены все сущности, которые можно загрузить из скрипта. Было бы лучше, если бы я мог знать имена всех переменных, которые я могу загрузить из файла со списком их имен. - person Elias Daler; 29.06.2014
comment
Опять же, вы не должны обращаться к сценарию в поисках именованных элементов, сценарий должен сообщать вам, какие сущности у него есть. Тем не менее, вы запросили список всех таблиц, определенных в файле, показав пример, когда эти таблицы являются глобальными. Переберите глобальные значения для значений, где type(x) == 'table' и все готово. Тем не менее гораздо лучше позволить сценарию сообщать вам о сущностях по значению, а не по имени. - person Mud; 30.06.2014
comment
Спасибо, думаю, так и будет. Кстати, что вы имеете в виду, когда говорите, что скрипт сообщает вам о сущностях по значению, а не по имени? Предположим, у меня есть объект с именем автомобиль, например. Мне нужно загрузить его из скрипта. Но мне нужно знать, из какого файла я могу его загрузить. Поэтому было бы очень удобно перебрать все файлы скриптов и создать std::pair‹std::string,std::vector‹std::string››, где первая строка — это имя файла, а вектор — список всех сущностей. определены в файле, чтобы я мог легко найти нужный скрипт позже. - person Elias Daler; 30.06.2014
comment
У вас есть вызов сценария RegisterEntity("car", ...), или Entity { foo=bar}, или Car { foo=bar }, или config("car", ...), или conf("car") { foo=bar }, или любой из миллионов других способов, которыми вы можете захотеть упорядочить вещи, чтобы сценарий сообщал вам, где находится конфигурация для конкретного объекта, а не вместо того, чтобы ваш код C++ копался в объектах, созданных сценарием, который ищет его. - person Mud; 30.06.2014
comment
Так что у меня может быть один файл сценария, который будет регистрировать все сущности и указывать C++, где их найти, верно? - person Elias Daler; 30.06.2014
comment
Сценарий не просто сообщает C++, что нужно найти сущность, он передает сущность C++. - person Mud; 30.06.2014
comment
Но мне также нужно, чтобы С++ знал, где найти объект, если этот конкретный объект необходимо перезагрузить, например - person Elias Daler; 30.06.2014
comment
@winch Скрипт компилируется как тело функции. Он может возвращать список значений любой длины. Вам просто нужно соглашение о том, что возвращать: это может быть сущность; Это может быть функция, создающая сущность; Это может быть таблица с определенными полями. (Это больше из миллиона способов.) - person Tom Blodget; 01.07.2014
comment
Большое спасибо, я понял. - person Elias Daler; 01.07.2014

Чтобы получить имена случайных глобальных переменных, созданных во время выполнения файла сценария, вам нужно будет использовать игры среды для запуска сценария в вашем собственном «глобальном» контексте.

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

person Etan Reisner    schedule 29.06.2014