Pregunta Barras invertidas en cadenas de comillas simples vs. cadenas de comillas dobles


Si agrego una barra invertida + espacio al comienzo de cadenas dobles e individuales, obtengo resultados diferentes:

"\ text"
'\ text' 

En el resultado de la cadena de comillas dobles, veo solo un espacio.
En el resultado para la secuencia de una sola cotización veo la barra invertida + espacio.

¿Lo que está ocurriendo allí? Es esto porque '\ ' se interpreta como un carácter especial en la cadena de comillas dobles pero en la secuencia de comillas simples los caracteres se conservan tal cual?

Si cambio las cadenas a esto, veo el mismo resultado, es decir, una barra oblicua seguida de un espacio y luego el texto:

"\\ text"
'\\ text' 

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

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


25
2018-03-15 17:08


origen


Respuestas:


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

De la referencia:

puts "Betty's pie shop"

puts 'Betty\'s pie shop'

Como "Betty's" contiene un apóstrofo, que es el mismo carácter que la comilla simple, en la segunda línea necesitamos usar una barra invertida para escapar del apóstrofo, de modo que Ruby entienda 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
2018-03-15 17:29



Las cadenas de comillas dobles admiten todo el rango de secuencias de escape, como se muestra a continuación:

  • \a Campana / alerta (0x07)
  • \b Retroceso (0x08)
  • \e Escape (0x1b)
  • \f Formford (0x0c)
  • \n Newline (0x0a)
  • \r Retorno (0x0d)
  • \s Espacio (0x20)
  • \t Pestaña (0x09)
  • \v Pestaña vertical (0x0b)

Para cadenas de una sola cita, dos barras invertidas consecutivas son reemplazadas por una sola barra invertida, y una barra invertida seguida de una comilla simple se convierte en una sola comilla:

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

19
2018-03-15 18:10



Ruby solo interpreta secuencias de escape en cadenas de comillas dobles. En una sola cadena entre comillas, solo \\ (barra invertida barra invertida) y \' (comillas invertidas) 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 mencionaste 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 cualquier expresión) ponga la expresión así:

"#{variable}"

Tenga en cuenta que esto solo funciona en cadenas de comillas dobles. Para agregar una variable a una sola entre comillas, debe hacer esto:

'The value of X is: '+X

Si necesita un formateo serio, busque en la versión de Ruby de sprintf y printf. Son prácticamente envoltorios de las funciones C, y son bastante potentes, pero un poco engorrosos de usar.


8
2017-11-26 15:21



Esta no es una respuesta completa (ya que la pregunta simple ya ha sido respondida), sino que es información suplementaria.

¿Qué estilo de cita de cuerdas de Ruby prefieres?

No use comillas dobles si tiene que   escapar de ellos. Y no caigas en "solo"   vs comillas dobles "trampa. Ruby tiene   excelente soporte para arbitrario   delimitadores para literales de cadena:

http://rors.org/2008/10/26/dont-escape-in-strings

¡Tomé ese consejo y nunca miré hacia atrás!


4
2018-03-16 11:52



Esto es porque el '\' es   interpretado como un personaje especial en   la cadena de comillas dobles, pero en el   única cadena citada 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.


3
2018-03-15 18:00