Получение переменных из файла - PullRequest
0 голосов
/ 16 декабря 2010

Предположим, у меня есть файл "test.lua", подобный следующему:

myVar = 5

Food = function()

end

Если я загружу файл через loadfile или через Lua API (в C ++ или где-либо еще) и запускаю его, переменныесохранено в глобальном пространстве имен _G;Тем не менее, я хотел бы иметь их отдельно, как _test.myVar и _G.myVar.(Причина в том, что я хочу иметь список переменных только из этого файла).Благодарю.

Ответы [ 3 ]

5 голосов
/ 16 декабря 2010

Используйте lua_setfenv перед запуском скрипта.

1 голос
/ 18 декабря 2010

Что LHF сказал.

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

Ключевая идея - быть осторожным с тем, какие глобальные функции и переменные доступны для кода, выполняемого в контексте вашего файла данных. Простой способ получить много контроля над этим - создать таблицу окружения, которая предоставляет глобальные переменные скрипту, чтобы он содержал только белый список безопасных функций. Вы делаете это, создавая подходящую таблицу, а затем устанавливая ее как среду только что скомпилированного скрипта, прежде чем вызывать ее. lua_setfenv() из C API или setfenv со стороны Lua могут оба использоваться на объекте, возвращенном при успешном вызове luaL_loadfile(), loadfile или один из их родственников в C API или из Lua, соответственно. Как только скрипт загружен и назначена среда, вы запускаете его с lua_pcall() или pcall.

Не забудьте проверить все на наличие ошибок.

Когда сценарий завершается, созданные им переменные записываются или обновляются в его таблице окружения, а не _G.

Естественно, эта таблица окружения может использовать метатаблицу, чтобы сделать некоторые глобальные переменные, которые вы предоставляете скрипту, доступными только для чтения.

Для дополнительного контроля некоторые пошли дальше и договорились ограничить количество виртуальных циклов команд или реальное время, отводимое сценарием. Можно даже проверить байт-код после загрузки на наличие определенных кодов операций. Это может быть использовано для предотвращения даже попытки выполнения сценария, который содержит цикл во многих случаях.

1 голос
/ 16 декабря 2010
module('_test')

myVar = 5

Food = function()

end

Затем из другого файла:

require 'test.lua' --> or loadfile('test.lua')()

print(myVar) --> nil
print(Food) --> nil
print(_test.myVar) --> 5
print(_test.Food) --> function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...