Глобальные переменные определяются со знака доллара $. Неинициализированные глобальные переменные имеют значение nil. Глобальные переменные относительно просты: однажды определенные в одном месте, они становятся доступными в любом месте кода. Однако одна из проблем глобальных переменных заключается в том, что их можно переназначать из любой точки кода, что может привести к непредвиденным побочным эффектам.
class A
$num = 123
end
class B
def self.change_global(new_value)
puts "Changing value of the global variable: #{$num}"
$num = new_value
puts "New value is: #{$num}"
end
end
B.change_global(321)
# => Changing value of the global variable: 123
# => New value is: 321
Считается, что использование в своем коде глобальных переменных - это плохая практика и этого нужно избегать. Повседневная жизнь, ежедневный код - просто не требуют неограниченной власти глобальной переменной.
Однако они существуют и могут быть необходимы в определенных, ограниченных сценариях:
Взаимодействие на системном уровне: Ruby использует специальные встроенные глобальные переменные для взаимодействия с системой и средой выполнения. Ярким примером является $stdout, представляющий собой стандартный поток вывода. Это глобальная переменная, поэтому любая часть программы или любая библиотека может записывать данные в стандартный поток вывода без необходимости явного указания потока.
Совместное использование данных между различными классами/методами: В редких, специфических случаях (например, в небольших, простых скриптах) одна переменная должна использоваться несколькими классами, модулями и функциями, которые не имеют иерархии наследования или прямой связи вызывающий/вызываемый код. Глобальные переменные предоставляют для этой цели наиболее широкие возможности.
Отладка/логирование: Они могут быть полезны для целей отладки, например, для установки глобального уровня логирования или имени файла, к которому могут обращаться и который могут изменять различные части кода.