This topic has missing or partial documentation. Please help us improve it.
По правилам синтаксиса имя глобальной переменной должно начинаться с $
.
Ожидается, что глобальные переменные доступны из любого контекста
Ruby-программы. Вместе с тем, существует три разновидности глобальных
переменных:истинные, тред-локальные и псевдоглобальные.
Истинные глобальные переменные связывают некоторое значение с
глобально-видимым именем. Пример: $LOAD_PATH
.
Тред-локальные глобальные переменные записываются в нотации
глобальных, но в запущенном процессе программы каждый тред имеет свою
отдельную версию переменной. Примерами тред-локальных глобалей являются
$SAFE
и $!
. Чтобы убедиться, что их величины зависят от контекста
треда, выполним следующий код:
puts $SAFE
Thread.new do
$SAFE = 2
puts $SAFE
end
puts $SAFE
Псевдоглобальные переменные — это ограниченное подмножество имен, которые ссылаются не на глобальные значения, а на значения в текущей области видимости, подобно локальным переменным. Их по-прежнему называют глобальными из-за того, что их имена начинаются со значка доллара, что является источником недоразумений со стороны пользователей.
Все псевдоглобали построены на основе одной, первичной псевдоглобальной
переменной: $~
. Все они обеспечивают доступ к разным частям $~
, и потому
при изменении $~
все они также изменяются.
Другими псевдоглобалями являются $&
, $`
(обратный апостроф), $'
(простой апостроф), $+
и группа $1
, $2
, $3
и т.п.
Одна из хитростей этих величин состоит в том, что они строго привязаны к текущей
области видимости, но Ruby позволяет создавать на них алиасы, как это сделано
в English.rb
.
Эти алиасы служат, в основном, способом добавить новые локальные переменные во
все области видимости, в том числе и уже запущенные. По этой причине Rubinius
не в полной мере их поддерживает. Вместо этого мы просто обеспечиваем алиасы,
по умолчанию записанные в English.rb
. Например, $MATCH
можно использовать
вместо $~
как при включенном English.rb
, так и без него.