2009-03-15 23 views
24

Si agrego una barra invertida + espacio para el inicio de las cadenas dobles e individuales citados, que obtienen resultados diferentes:Las barras invertidas en cadenas entre comillas sencillas en comparación con cuerdas dobles citados

"\ text" 
'\ text' 

En la salida de la cadena entre comillas dobles Solo veo un espacio.
En la salida para la cadena entre comillas, veo la barra invertida + espacio.

¿Qué está pasando allí? ¿Esto se debe a que '\ ' se interpreta como un carácter especial en la cadena de comillas dobles, pero en la cadena de una sola cita los caracteres se conservan como están?

Si cambio de las cuerdas a esto, ver el mismo resultado, es decir, una sola barra seguida de un espacio y el texto:

"\\ text" 
'\\ text' 

En ambos casos se escapó de la barra invertida. Estoy confundido por qué funcionan de la misma manera en esta situación.

¿Hay alguna regla que ayude a explicar la diferencia fundamental entre las cadenas de comillas simples y las cadenas de comillas dobles que manejan las barras diagonales inversas en Ruby?

+0

Después de sus ediciones, su pregunta ahora es esencialmente "es Wikilibros actualmente actualizado para Ruby 1.9". Edite el título de la pregunta para que coincida con esto. – bzlm

Respuesta

6

Te remito a "Ruby Programming/Strings" para obtener una visión general muy concisa pero completa de las diferencias.

De la referencia:

puts "Betty's pie shop"

puts 'Betty\'s pie shop'

Debido a "Betty" contiene un apóstrofo, que es el mismo carácter que la comilla simple, en la segunda línea tenemos que utilizar una barra inclinada invertida para escapar del apóstrofo, de modo que Ruby comprenda que el apóstrofo está en la cadena literal en lugar de marcar el final de la cadena literal. La barra diagonal inversa seguida de la comilla simple se llama secuencia de escape.

+6

De ["¿Cómo escribo una buena respuesta?"] (Https://stackoverflow.com/help/how-to-answer): "Se alientan los enlaces a recursos externos, pero agregue contexto alrededor del enlace para que sus compañeros los usuarios tendrán alguna idea de lo que es y por qué está allí. Siempre cite la parte más relevante de un enlace importante, en caso de que el sitio objetivo no esté disponible o esté permanentemente fuera de línea ". –

3

Es esto debido a que el '\' se interpreta como un carácter especial en la cadena de comillas dobles, pero en el sola cadena entre comillas los personajes se conservan como es?

Sí. Las cadenas de comillas simples se tratan como literales; las cadenas de comillas dobles están interpoladas. Esto es lo mismo en otros lenguajes similares a Ruby, y no ha cambiado en 1.9.

+0

¿hay forma de convertir cadenas de comillas dobles (interpoladas) en comillas simples? –

+0

¡Me sorprendería si no hubiera sido así! – bzlm

18

cadenas entre comillas dobles soportan la gama completa de secuencias de escape, como se muestra a continuación:

  • \a de Bell/alerta (0x07)
  • \b Retroceso (0x08)
  • \e Escape (0x1b)
  • \f Formford (0x0C)
  • \n Newline (0x0a)
  • \r Retorno (0x0D)
  • \s espacio (0x20)
  • \t Tab (0x09)
  • \v pestaña vertical (0x0B)

Para las cadenas entre comillas simples, dos barras invertidas consecutivos se sustituyen por una barra diagonal inversa, y una barra diagonal inversa seguida de una comilla simple se convierte en una comilla simple:

'escape using "\\"' -> escape using "\" 
'That\'s right'  -> That's right 
+0

¿Hay algún uso para una sola barra invertida por sí mismo en cadenas dobles o simples entre comillas? Estoy confundido, ya que no parece hacer nada en absoluto, pero desaparecen – thesowismine

7

Ruby solo interpreta secuencias de escape en cadenas entre comillas dobles. En una cadena única entre comillas, solo \\ (barra diagonal inversa) y \' (comilla inversa) se toman como caracteres especiales. Debe usar cadenas dobles entre comillas solo cuando necesite más interpretación. De lo contrario, las comillas simples proporcionan un aumento de rendimiento.

Cuando mencionó incluir el nombre de una variable, Ruby nunca hace eso. Solo el nombre de la variable se trata como más del literal de la cadena. Para incluir el valor de una variable (o ninguna expresión) ponga la expresión de la siguiente manera:

"#{variable}" 

Tenga en cuenta que esto sólo funciona en cadenas entre comillas dobles. Para añadir una variable a una sola citado uno, usted tiene que hacer esto:

'The value of X is: '+X 

Si necesita formato grave, mira en la versión de Rubí de sprintf y printf. Son prácticamente envoltorios de las funciones C, y son bastante potentes, pero un poco engorrosos de usar.

+0

No creo en la parte sobre el aumento del rendimiento. No aparecerá en los puntos de referencia porque Ruby analiza la cadena mientras carga el archivo y la diferencia desaparece. Hicimos un benchmark en SO en alguna parte de una de las preguntas, con resultados que desacreditaron esa idea. * Si * hay un impulso, es pequeño y solo ocurrirá durante la puesta en marcha de una aplicación. –

+0

@theTinMan: ¿Cree que puede encontrarme el punto de referencia? Me gustaría mirarlo. Teóricamente, debería haber un aumento en el rendimiento por no tener que buscar las secuencias de escape, pero eso es solo un poco de C optimizado que sería una diferencia difícil de notar. – Linuxios

+0

El [punto de referencia] (http://stackoverflow.com/a/13039446/128421) en cuestión se trataba de varias formas de definir matrices. Creo que existe la misma situación para las cadenas, que las diferencias se eliminan a medida que se carga la secuencia de comandos, y una vez en la memoria no hay diferencia real. Es fácil escribir una prueba para ver por ti mismo en base al punto de referencia en esa respuesta. –

Cuestiones relacionadas