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

91

Правильный способ использования строковой интерполяции в 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.

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

Чарльз Колдуэлл
источник

Ответы:

104

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

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

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

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

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

$var = "Hi"
puts "#$var there!"  #=> "Hi there!"
Цериф
источник
4
Классный вопрос, кстати. Приятно вернуться и найти уголки языка, о котором я забыл.
tsherif
2
Хотя в вашем ответе не указано, почему или что происходит, я считаю, что причину трудно определить. Даже старые доски объявлений, которые Матц часто комментировал, не помогают. Однако ваш ответ показывает, что это особенность, а не просто случайность.
Чарльз Колдуэлл
1
Я не уверен, что вы ожидаете в качестве причины. Вы имеете ввиду как дизайнерское решение? Я предполагаю, что это была попытка синтаксиса, подобного Perl, поскольку я считаю, что Ruby изначально задумывался как разновидность Perl ++, прежде чем стать самостоятельным.
tsherif
2
Я полный нуб, и моя IDE только что жаловалась на то, что я делаю это. Но мне нелегко убедить себя, что это хороший стиль. Это бессмысленно непоследовательно и имеет обратную сторону - например, если у меня есть переменная экземпляра @distance со значением 100 и я хочу создать строку, которая говорит что-то вроде «100m», используя выражение типа «# @ distancem», я просто получу пустую строку потому что нет переменной экземпляра distancem. Так что это звучит как откровенно плохой стиль.
ужасная
3
@terriblememory О, это определенно плохой стиль. Вот почему я начал свой вопрос с указания правильного способа сделать это. Однако мне показалось странным, что это вообще была особенность языка, и я задумался, почему это работает. Опять же, начинать предложение со союза - тоже плохой стиль. Но вы по-прежнему будете видеть людей, использующих его здесь и там. =)
Чарльз Колдуэлл