TL; DR
Да, Специальные глобальные переменные Regexp являются поточно-ориентированными, потому что они не являются глобальными. Несмотря на то, что переменные в названии имеют слово «global», в документации написано:
Эти глобальные переменные являются локальными переменными потока и локальными методами.
Тема
Вы можете доказать это себе в отклике irb или pry. Например, чтобы проверить область видимости переменных внутри потоков:
# Ensure $~ and friends are nil in case this isn't a fresh REPL.
''.match /foo/
# Make this variable available inside the thread block.
thread_match = nil
Thread.new do
'foo'.match /(foo)/
thread_match = "In thread: #{$1.inspect}"
end
[thread_match, "Global value: #{$1.inspect}"]
#=> ["In thread: \"foo\"", "Global value: nil"]
Методы
Эти специальные переменные даже не являются глобальными при использовании внутри метода. Учтите следующее:
def foo
'foo'.match /(foo)/
p $1
end
[foo, $1]
#=> ["foo", nil]
Заключение
Другими словами, специальные переменные Regexp выглядят как настоящие глобалы из-за префикса $
, но не сохраняются вне окружающего потока или метода. В какой степени это оправдывает называть их «глобальными» вообще - это то, с чем вам придется столкнуться с разработчиками языка или сообщить об ошибке, если вы твердо убеждены, что это вводит в заблуждение.