¿Por qué la interpolación de cadenas funciona en Ruby cuando no hay llaves?

90

La forma correcta de utilizar la interpolación de cadenas en Ruby es la siguiente:

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

Esa es la forma en que tengo la intención de usarlo siempre.

Sin embargo, he notado algo extraño en la interpolación de cadenas de Ruby. He notado que la interpolación de cadenas funciona en Ruby sin las llaves en lo que respecta a las variables de instancia. Por ejemplo:

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

Y que intentar lo mismo que una variable que no es de instancia no funciona.

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

He intentado esto con éxito tanto en 1.9.2 como en 1.8.7.

¿Por qué funciona esto? ¿Qué está haciendo el intérprete aquí?

Charles Caldwell
fuente

Respuestas:

103

Según el lenguaje de programación Ruby de Flanagan y Matsumoto:

Cuando la expresión que se va a interpolar en la cadena literal es simplemente una referencia a una variable global, de instancia o de clase, se pueden omitir las llaves.

Entonces, todo lo siguiente debería funcionar:

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

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

$var = "Hi"
puts "#$var there!"  #=> "Hi there!"
tsherif
fuente
4
Buena pregunta, por cierto. Es agradable volver atrás y encontrar los pequeños rincones del idioma que me había olvidado.
tsherif
2
Aunque su respuesta no contiene una razón de por qué o qué está sucediendo, encuentro que la razón es difícil de precisar. Incluso los viejos foros de mensajes que Matz comentaba con frecuencia no están ayudando. Sin embargo, su respuesta muestra que es una característica y no solo una casualidad.
Charles Caldwell
1
Sin embargo, no estoy seguro de cuál es la razón que esperas. ¿Te refieres a una decisión de diseño? Supongo que fue un intento de sintaxis similar a Perl , ya que creo que Ruby se concibió originalmente como una especie de Perl ++ antes de convertirse en una realidad.
tsherif
2
Soy un novato completo y mi IDE acaba de quejarse de que hago esto. Pero me cuesta trabajo convencerme de que es de buen estilo. Es inútilmente inconsistente y tiene una desventaja, por ejemplo, si tengo una variable de instancia @distance con valor 100 y quiero hacer una cadena que diga algo como "100m" usando una expresión como "# @ distancem", obtendré una cadena en blanco porque no hay una variable de instancia 'distanciam'. Así que esto suena a mal estilo.
terriblememory
3
@terriblememory Oh, definitivamente es un mal estilo. Por eso comencé mi pregunta señalando la forma correcta de hacerlo. Sin embargo, me pareció extraño que fuera una característica del lenguaje y me preguntaba por qué funcionaba. Por otra parte, también es de mal estilo comenzar una oración con una conjunción. Pero todavía verá gente usándolo aquí y allá. =)
Charles Caldwell