Перейти к содержанию

Дайджесты за январь-февраль

Обновления гайдов и аддонов

Январь Февраль

Мониторинг серверов и редактор аддонов

Представляем вам две легенды. То, о чем можно было только мечтать, стало реальностью.

Мониторинг серверов Редактор аддонов

Подсказки из игры на вашем сайте

Теперь вы можете отображать сведения о внутриигровых элементах простым наведением курсора мыши.

Подробнее

Апдейтер аддонов

Представляем вам программу для автообновления аддонов и делимся подробностями.

Подробнее Скачать

Как проверить существует ли переменная


jedbez

Рекомендуемые сообщения

Есть переменная BD находящаяся во внешнем файле, её возможно могут удалить. Как проверить существует ли она, объявлена ли?

Ссылка на комментарий
Поделиться на другие сайты

if BD == nil then

return

else

 

end

? так не работает?

И к бабке ходить не надо (читай: запускать аллоды), получим:

Attempt to read from undeclared global variable: BD
Ссылка на комментарий
Поделиться на другие сайты

Вот именно, а проверить её существовани

 

if BD == nil then

return

else

 

end

? так не работает?

 

И к бабке ходить не надо (читай: запускать аллоды), получим:

Attempt to read from undeclared global variable: BD

 

Именно это и получается, а вот проверить её на то что обьявлена ли она, как раз и встал вопрос.

Ссылка на комментарий
Поделиться на другие сайты

По теме.

Если нужно проверить глобальную переменную:

Есть такая табличка _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 в отдельное глобальное окружение, а потом при наличии глобальной переменной копировал в локальную переменную её содержание.

Ссылка на комментарий
Поделиться на другие сайты

Вот именно, а проверить её существовани

Именно это и получается, а вот проверить её на то что обьявлена ли она, как раз и встал вопрос.

 

Если это не значение энума, заведенное разработчиками, то: 

rawget( _G, "var_name" ) ~= nil
Ссылка на комментарий
Поделиться на другие сайты

Собственно, поиск по _G. Для локальных переменных тоже работает?

Ссылка на комментарий
Поделиться на другие сайты

Если ты про чтение настроек, то я делал чтение через 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 может не существовать и опять ругнется :(

Ссылка на комментарий
Поделиться на другие сайты

Надо попробовать:

if rawget( _G, "BD" ) ~= nil then LogToChat("ииххаааа...") else  LogToChat("хм...") end 

 

 

Оооо работает, спс

Ссылка на комментарий
Поделиться на другие сайты

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...

Важная информация

Пользуясь сайтом, вы принимаете Условия использования