Особенность использования переменной $DEBUG

Столкнулся сегодня с непонятной для меня ошибкой, решением которой стало очередное гугление и копание в коде. Всё это привело к довольно занятному разбору полётов, коим делюсь с вами.

Суть ошибки заключалась в следующих строках:


Exception `NameError' at /Library/Ruby/Gems/2.0.0/gems/activesupport-4.1.1/lib/active_support/dependencies.rb:518 - uninitialized constant EM_CONNECTION_CLASS
Exception `NameError' at /Library/Ruby/Gems/2.0.0/gems/activesupport-4.1.1/lib/active_support/dependencies.rb:518 - uninitialized constant AuthenticationServer::EM_CONNECTION_CLASS

У меня ничего сложного в коде нет: обычный EventMachine, ROTP и ещё пару необходимых гемов, которые успешно работали около двух недель безо всяких проблем. Но именно сегодня утром всё обвалилось непонятно по какой причине.

Первым делом переустановил гем activesupport, думал дело в нём. Но я ошибся.
После этого переустановил EventMachine, а следом и весь gem update.
Но и после этого ничего не произошло. Ошибка не пропадала. 🙂

Тогда я попытался вспомнить, что ж такого я добавил за выходные в код, что всё сломалось. И вот что это было:

$DEBUG = true

сразу после подключения гемов!

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

Удалив её, я получил вновь работающий код.

Почему так?

Всё оказалось довольно просто, вот здесь было найдено описание проблемы: http://nhw.pl/wp/2006/08/04/debug-variable-in-ruby. Цитирую:

In Ruby script, when to interpreter -d option is supplied (from command line or in #! line on the script start) global $DEBUG flag is set. This can be used to produce Your own debug output, like:

puts «You are here» if $DEBUG

В общем, всё сводится к тому, что при передаче ключа -d интерпретатору Ruby в консоли — эта переменная автоматически устанавливается самим интерпретатором. А я и не знал, что такое бывает 😉

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *