La forma correcta de usar la interpolación de cadenas en Ruby es como sigue:

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

Que es la manera que tengo la intención de usarla siempre.

Sin embargo, me he dado cuenta de algo impar en Rubí de la cadena de interpolación. Me he dado cuenta de que la interpolación de cadenas obras 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 tratando de la misma cosa, como un no-variable de instancia no funciona.

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

He intentado esto con éxito en la 1.9.2 y 1.8.7.

¿Por qué funciona esto? ¿Cuál es el intérprete haciendo aquí?

1 Comentario

  1. 97

    Según El Lenguaje de Programación Ruby por Flanagan y Matsumoto:

    Cuando la expresión se interpola en el literal de cadena es simplemente una referencia a un mundial, instancia o variable de clase, luego de las llaves puede ser omitido.

    Por lo que el siguiente debería todo el trabajo:

    @var = "Hi"
    puts "#@var there!"  #=> "Hi there!"
    
    @@var = "Hi"
    puts "#@@var there!" #=> "Hi there!"
    
    $var = "Hi"
    puts "#$var there!"  #=> "Hi there!"
    • Ah. Página 48. Buen ojo.
    • Fresco pregunta, por cierto. Es bueno volver y encontrar los rincones de la lengua me había olvidado.
    • Aunque su respuesta no contiene una razón de por qué, o lo que está pasando, me estoy encontrando que la razón es difícil de concretar. Incluso los viejos tablones de mensajes Matz comentado con frecuencia no están ayudando. Sin embargo, su respuesta muestra que es una característica frente a sólo un golpe de suerte.
    • No estoy seguro de lo que usted está esperando como una razón, sin embargo. A qué te refieres como una decisión de diseño? Mi conjetura sería que era un intento de Perl-como la sintaxis, ya que creo que Ruby fue originalmente concebido como una especie de Perl++ antes de entrar en su propio.
    • Fresco, no usar {} en torno a las variables de instancia se interpolan en una cadena. github.com/bbatsov/ruby-style-guide
    • Soy un completo noob y sólo tenía mi IDE se quejan de mí haciendo esto. Pero estoy teniendo un duro trabajo de convencer a mí mismo de que es un buen estilo. Es inútilmente inconsistente y tiene una desventaja – por ejemplo, si tengo una variable de instancia @distancia con un valor de 100 y quiero hacer una cadena que dice algo así como «100 metros», utilizando una expresión como «#@distancem» voy a conseguir una cadena en blanco porque no hay ninguna variable de instancia ‘distancem’. Así que esto suena francamente mal estilo.
    • Oh está definitivamente mal estilo. Por eso empecé mi pregunta señalando la manera correcta de hacerlo. Sin embargo, me pareció extraño que era una característica de la lengua a todos y se preguntó por qué funcionaba. A continuación, de nuevo, que está también mal estilo de iniciar una frase con una conjunción. Pero todavía veo gente que lo usa aquí y de allí. =)
    • Sospecho que el la razón es que las variables de cada tipo que tiene un prefijo. De esa manera el intérprete conozca su interpolación cuando se ve «#{«, «#@», «#@@», o «#$» pero no se puede distinguir «#nombre» de «somos #1», o «#firstworldproblems».
    • el consejo fue invierte: no deja fuera {} alrededor de instancia y variables globales se interpolan en una cadena.
    • Bueno, es la misma en bash, puede utilizar $var o ${var}. Suelen utilizar la más corta y menos feo variante, pero cuando es necesario el uso de la forma larga. A mí el rubí elección de #{} es bastante feo.
    • estoy bastante seguro de que uno es una interpolación de variables, y la otra es la interpolación de código. Pero la interpolación de código es la forma más general de hacer las cosas, y la otra ventaja de tener el separador del resto de la cadena integrada. Así que la mayoría de la gente utiliza el #{} sintaxis. Tal vez si no hay ningún compilador de optimización de la #@var manera es más rápido (sólo una variable de búsqueda, y no una función anónima llamada.

Dejar respuesta

Please enter your comment!
Please enter your name here