Guillemets doubles ou simples

172

Je suis vraiment nouveau à Ruby et je suis en train de comprendre s'il y a un temps spécifique quand je devrais utiliser ""vs ''.

J'ai utilisé des guillemets simples la plupart du temps parce que c'est plus facile à taper mais je ne sais pas si je devrais.

par exemple get 'user/new'vsget "user/new"

imjp
la source
12
Êtes-vous sûr qu'il s'agit d'une question RoR, et pas seulement d'une question Ruby?
Ignacio Vazquez-Abrams
Existe-t-il un guide de style pertinent pour choisir quand l'interpolation de chaîne n'est pas nécessaire?
William Entriken

Réponses:

202

" " vous permet de faire une interpolation de chaîne, par exemple:

world_type = 'Mars'
"Hello #{world_type}"
Jits
la source
1
Donc, en gros, utilisez simplement des guillemets doubles tout le temps, non?
nekonari
8
Non - les guillemets doubles permettent simplement une interpolation de chaîne. Si vous ne voulez pas d'interpolation de chaîne, vous ne devez pas utiliser de guillemets doubles.
Panh du
4
Il n'y a aucune raison d'utiliser des guillemets doubles uniquement lorsque vous avez besoin d'une interpolation, il n'y a pas d'impact significatif sur les performances et cela vous fera simplement réfléchir à ce que vous devez utiliser. Utilisez simplement des chaînes entre guillemets.
Matheus
137

à l'exception de l'interpolation, une autre différence est que la 'séquence d'échappement' ne fonctionne pas en guillemet simple

puts 'a\nb' # just print a\nb 
puts "a\nb" # print a, then b at newline 
lfx_cool
la source
42
Sauf pour les guillemets simples, par exemple 'don\'t'.
Sparhawk
3
C'est une réponse très utile à cette question. Je n'ai jamais réalisé que les guillemets simples servaient à imprimer littéralement tout ce qui se trouvait entre les guillemets simples, à l'exception des guillemets qui doivent être échappés. Je vous remercie.
Jay Godse
6
Et la barre oblique inverse essayez également. puts '\\'Elle n'imprimera qu'une seule barre oblique. voir ici stackoverflow.com/questions/25499046/…
Hardik
oui, ce sont les deux seuls cas auxquels vous pouvez échapper avec des guillemets simples
Alexis
@Alex n'est pas sûr, peut-être une petite différence sur les performances
lfx_cool
40

Pour répondre à votre question, vous devez utiliser ""lorsque vous souhaitez effectuer une interpolation de chaîne:

a = 2
puts "#{a}"

Sinon, utilisez des guillemets simples.

Aussi, si vous vous demandez s'il y a une différence en termes de performances, il y a une excellente question à ce sujet sur StackOverflow.

Et si vous êtes vraiment nouveau sur RoR, je vous exhorte à vous procurer un livre Ruby décent pour apprendre les bases de la langue. Cela vous aidera à comprendre ce que vous faites (et vous empêchera de penser que Rails est magique). Je recommande personnellement The Well Grounded Rubyist .

Amokrane Chentir
la source
34

Il y a une différence entre les ''guillemets simples et doubles ""dans Ruby en termes de ce qui doit être évalué dans une chaîne.

Au départ, je voudrais préciser que, sous la forme littérale d'une chaîne, tout ce qui se trouve entre des guillemets simples ou doubles est évalué comme un objet chaîne, qui est une instance de la classe Ruby String.

Par conséquent, 'stackoverflow'et les "stackoverflow"deux évalueront les instances de la classe String sans aucune différence .

La différence

La différence essentielle entre les deux formes littérales de chaînes (guillemets simples ou doubles) est que les guillemets doubles permettent des séquences d'échappement alors que les guillemets simples ne le font pas!

Un littéral de chaîne créé par des guillemets simples ne prend pas en charge l' interpollation de chaînes et n'échappe pas les séquences.

Un bon exemple est:

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

tandis que

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

L'interpolation avec des guillemets simples ne fonctionne pas du tout:

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

Meilleur entrainement

Comme la plupart des Ruby Linters suggèrent d' utiliser des littéraux de guillemets simples pour vos chaînes et optez pour les doubles dans le cas des séquences d'interpolation / d'échappement.

Aloucas
la source
1
Donc, si vous aviez a = '\ n' et b = "# {a}", b serait-il interprété comme une nouvelle ligne ou comme la séquence d'échappement?
NathanTempelman
4
Au moment où vous attribuez a = '\ n' a est interprété comme "\\ n" en interpolant a à b, vous n'obtiendrez pas de nouvelle ligne. b évaluera à "\\ n" (pas de nouvelle ligne, vous obtenez la séquence d'échappement). a = '\ n' => "\\ n" where as a = "\ n" => "\ n"
aloucas
6

Les chaînes entre guillemets simples ne traitent pas les codes d'échappement ASCII (\ n, \ t etc.), et elles ne font pas d'interpolation de chaîne alors que les guillemets doubles font les deux.

Exemple de code d'échappement:

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

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

Exemple d'interpolation:

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
la source
4

Semblable à la réponse "\ n" en impression, voici un autre cas de différence

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

ressemble donc à * a été converti en caractère échappé entre guillemets doubles, mais pas entre guillemets simples. BTW, cela aura un impact sur la sortie lors de l'utilisation dans une expression régulière, par exemple, str.gsub (/ expression régulière /, '\ 1, \ 2')

Bryan Liu
la source
2

Une autre raison pour laquelle vous voudriez utiliser des guillemets simples est lorsque vous passez un modèle d'expression régulière sous forme de chaîne:

Ce modèle regex fonctionnera car il est passé entre guillemets simples:

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

Ce modèle regex échouera car il est passé entre guillemets (vous devrez le double-échapper pour le faire fonctionner):

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

Dans ce cas précis, la manière dont vous l'écrivez ne fait aucune différence. Ils sont équivalents. En outre, vous voudrez peut-être lire d'autres guides / tutoriels Ruby :)

Géo
la source
4
Ils ne sont pas équivalents, car les guillemets doubles permettent l'interprétation des chaînes.
Jason Noble
7
Avez-vous lu la partie «Dans ce cas précis», avant de faire cette observation extrêmement intelligente?
Geo
9
Oui, mais sa question était de savoir quand utiliser des guillemets simples ou doubles.
Jason Noble