Почему интерполяция строк работает в Ruby, когда нет фигурных скобок?

Правильный способ использования интерполяции строк в Ruby выглядит следующим образом:

name = "Ned Stark"
puts "Hello there, #{name}" #=> "Hello there, Ned Stark"

Именно так я намерен всегда использовать его.

Тем не менее, я заметил что-то нечетное в интерполяции строк Ruby. Я заметил, что строковая интерполяция работает в Ruby без фигурных скобок относительно переменных экземпляра. Например:

@name = "Ned Stark"
puts "Hello there, #@name" #=> "Hello there, Ned Stark"

И что попытка того же, что и переменная без экземпляра, не работает.

name = "Ned Stark"
puts "Hello, there, #name" #=> "Hello there, #name"

Я пробовал это с успехом в версиях 1.9.2 и 1.8.7.

Почему это работает? Что здесь делает интерпретатор?

Ответ 1

Согласно языку программирования Ruby от Flanagan и Matsumoto:

Когда выражение, которое должно быть интерполировано в строковый литерал, является просто ссылкой на глобальную переменную экземпляра или класса, то фигурные скобки могут быть опущены.

Итак, все должно работать:

@var = "Hi"
puts "#@var there!"  #=> "Hi there!"

@@var = "Hi"
puts "#@@var there!" #=> "Hi there!"

$var = "Hi"
puts "#$var there!"  #=> "Hi there!"