Comillas dobles vs simples

172

Estoy realmente nuevo a Ruby y yo estoy tratando de entender si hay un tiempo específico cuando debería utilizar ""vs ''.

He estado usando comillas simples la mayor parte del tiempo porque es más fácil de escribir pero no estoy seguro de si debería hacerlo.

por ejemplo get 'user/new'vsget "user/new"

imjp
fuente
12
¿Estás seguro de que esta es una pregunta RoR, y no solo una pregunta Ruby?
Ignacio Vazquez-Abrams
¿Existe una guía de estilo relevante para elegir cuándo no se necesita la interpolación de cadenas?
William Entriken

Respuestas:

202

" " le permite hacer interpolación de cadenas, por ejemplo:

world_type = 'Mars'
"Hello #{world_type}"
Jits
fuente
1
Básicamente, solo usa comillas dobles todo el tiempo, ¿verdad?
nekonari
8
No, las comillas dobles simplemente permiten la interpolación de cadenas. Si no desea la interpolación de cadenas, no debe usar comillas dobles.
Panh
44
No hay razón para usar comillas dobles solo cuando necesita interpolación, no hay un impacto significativo en el rendimiento y solo le hará pensar lo que tiene que usar. Solo use cadenas con comillas dobles.
Matheus
137

excepto la interpolación, otra diferencia es que la 'secuencia de escape' no funciona entre comillas simples

puts 'a\nb' # just print a\nb 
puts "a\nb" # print a, then b at newline 
lfx_cool
fuente
42
Excepto para escapar de las comillas simples, por ejemplo 'don\'t'.
Falquián
3
Esta es una respuesta muy útil a esta pregunta. Nunca me di cuenta de que las comillas simples eran para imprimir literalmente todo entre comillas simples, con la excepción de las comillas que se deben escapar. Gracias.
Jay Godse
66
Y la barra diagonal inversa también lo intenta puts '\\'. Solo imprimirá una barra inclinada. ver aquí stackoverflow.com/questions/25499046/…
Hardik
sí, son los únicos dos casos de los que puedes escapar con comillas simples
Alexis
@Alexis no está seguro, tal vez una pequeña diferencia en el rendimiento
lfx_cool
40

Para responder a su pregunta, debe usarla ""cuando desee realizar la interpolación de cadenas:

a = 2
puts "#{a}"

Use citas simples de lo contrario.

Además, si se pregunta si hay una diferencia en términos de rendimiento, hay una excelente pregunta sobre esto en StackOverflow.

Y si usted es realmente nuevo en RoR, le insto a que elija un libro Ruby decente para aprender los conceptos básicos del idioma. Le ayudará a comprender lo que está haciendo (y le impedirá pensar que Rails es mágico). Yo personalmente recomiendo The Well grounded Rubyist .

Amokrane Chentir
fuente
34

Hay una diferencia entre ''comillas simples y dobles ""en Ruby en términos de lo que se evalúa en una cadena.

Inicialmente, me gustaría aclarar que, en la forma literal de una cadena, lo que sea que esté entre comillas simples o dobles se evalúa como un objeto de cadena, que es una instancia de la clase Ruby String.

Por lo tanto, 'stackoverflow'y "stackoverflow"ambos evaluarán las instancias de la clase String sin ninguna diferencia .

La diferencia

¡La diferencia esencial entre las dos formas literales de cadenas (comillas simples o dobles) es que las comillas dobles permiten secuencias de escape, mientras que las comillas simples no lo hacen!

Un literal de cadena creado por comillas simples no admite la interpollación de cadena y no escapa a las secuencias.

Un buen ejemplo es:

"\n" # will be interpreted as a new line

mientras

'\n' # will display the actual escape sequence to the user

La interpolación con comillas simples no funciona en absoluto:

'#{Time.now}'
=> "\#{Time.now}" # which is not what you want..

Mejores prácticas

Como la mayoría de los Ruby Linters sugieren usar literales de comillas simples para sus cadenas e ir a los dobles en el caso de secuencias de interpolación / escape.

aloucas
fuente
1
Entonces, si tuviera a = '\ n' y b = "# {a}", ¿se interpretaría b como una nueva línea o como la secuencia de escape?
NathanTempelman
44
En el momento en que asigna a = '\ n' a, se interpreta como "\\ n" interpollando a a b, no obtendrá una nueva línea. b evaluará a "\\ n" (no se obtiene una nueva línea de la secuencia de escape). a = '\ n' => "\\ n" donde como a = "\ n" => "\ n"
aloucas
6

Las cadenas entre comillas simples no procesan códigos de escape ASCII (\ n, \ t, etc.), y no hacen interpolación de cadenas, mientras que las comillas dobles hacen ambas cosas.

Ejemplo de código de escape:

2.4.0 :004 >   puts 'Hello \n World'
Hello \n World

2.4.0 :005 > puts "Hello \n World"
Hello
World

Ejemplo de interpolación:

2.4.0 :008 >   age=27
 => 27

2.4.0 :009 > puts 'Age: #{age}'
Age: #{age}

2.4.0 :009 > puts "Age: #{age}"
Age: 27
Imran Ahmad
fuente
4

Similar a la respuesta "\ n" en la impresión, el siguiente es otro caso de la diferencia

puts "\1"  -> get special character
puts '\1'  -> get \1

parece que * se convirtió en carácter escapado entre comillas dobles, pero no entre comillas simples. Por cierto, tendrá un impacto en la salida cuando se usa en expresiones regulares, por ejemplo, str.gsub (/ regular expression /, '\ 1, \ 2')

Bryan Liu
fuente
2

Otra razón por la que desearía usar comillas simples es al pasar un patrón regex como una cadena:

Este patrón de expresiones regulares funcionará porque se pasa entre comillas simples:

"123 ABC".match('\d')
=> #<MatchData "1">

Este patrón regex fallará porque se pasa entre comillas dobles (tendrías que escapar dos veces para que funcione):

"123 ABC".match("\d")
=> nil
Yarin
fuente
-8

En este caso específico, no importa cómo lo escriba. Son equivalentes Además, es posible que desee leer más guías / tutoriales de Ruby :)

Geo
fuente
44
No son equivalentes, ya que las comillas dobles permiten la interpretación de cadenas.
Jason Noble
77
¿Leyó la parte "En este caso específico", antes de hacer esa observación extremadamente inteligente?
Geo
9
Sí, pero su pregunta era cuándo usar comillas simples o dobles.
Jason Noble