jedbez Posted August 20, 2013 Share Posted August 20, 2013 Есть переменная BD находящаяся во внешнем файле, её возможно могут удалить. Как проверить существует ли она, объявлена ли? Quote Link to comment Share on other sites More sharing options...
CJloHuK Posted August 20, 2013 Share Posted August 20, 2013 if BD == nil then return else end ? так не работает? Quote Link to comment Share on other sites More sharing options...
Mankubus Posted August 20, 2013 Share Posted August 20, 2013 if BD == nil then return else end ? так не работает? И к бабке ходить не надо (читай: запускать аллоды), получим: Attempt to read from undeclared global variable: BD Quote Link to comment Share on other sites More sharing options...
jedbez Posted August 20, 2013 Author Share Posted August 20, 2013 Вот именно, а проверить её существовани if BD == nil then return else end ? так не работает? И к бабке ходить не надо (читай: запускать аллоды), получим: Attempt to read from undeclared global variable: BD Именно это и получается, а вот проверить её на то что обьявлена ли она, как раз и встал вопрос. Quote Link to comment Share on other sites More sharing options...
Mankubus Posted August 20, 2013 Share Posted August 20, 2013 По теме. Если нужно проверить глобальную переменную: Есть такая табличка _G, либо есть табличка, которую возвратит нам getfenv(0), поиском по данной таблице (не нужно, думаю, рассказывать, как реализовать) и найдем, есть ли такая переменная или нет. Если нужно проверить локальную переменную: Помним, что локальные переменные имеют приоритет над глобальными, соответственно, способ "в лоб": local DB = 100; --some code here Global("DB", -1) if DB != -1 then --var is declared locally else --undeclared end С другой стороны, её ведь могут не только удалить, но изменить значение, тип, итд. Проверки не помешают. Если ты про чтение настроек, то я делал чтение через pcall - dofile в отдельное глобальное окружение, а потом при наличии глобальной переменной копировал в локальную переменную её содержание. Quote Link to comment Share on other sites More sharing options...
ramirez Posted August 20, 2013 Share Posted August 20, 2013 Вот именно, а проверить её существовани Именно это и получается, а вот проверить её на то что обьявлена ли она, как раз и встал вопрос. Если это не значение энума, заведенное разработчиками, то: rawget( _G, "var_name" ) ~= nil Quote Link to comment Share on other sites More sharing options...
Mankubus Posted August 20, 2013 Share Posted August 20, 2013 Собственно, поиск по _G. Для локальных переменных тоже работает? Quote Link to comment Share on other sites More sharing options...
jedbez Posted August 20, 2013 Author Share Posted August 20, 2013 Если ты про чтение настроек, то я делал чтение через pcall - dofile в отдельное глобальное окружение, а потом при наличии глобальной переменной копировал в локальную переменную её содержание. т.е. if not pcall( dofile, "../data/Mods/Addons/MyAddon/DBase.lua" ) then return end изящное решение, мне понравилось... и потом? local cBD={} for i=1,geTableSize(BD)do cBD={BD.NAME,BD.CENA} end Хотя все равно BD может не существовать и опять ругнется Quote Link to comment Share on other sites More sharing options...
jedbez Posted August 20, 2013 Author Share Posted August 20, 2013 Надо попробовать: if rawget( _G, "BD" ) ~= nil then LogToChat("ииххаааа...") else LogToChat("хм...") end Оооо работает, спс 1 Quote Link to comment Share on other sites More sharing options...
Recommended Posts