Virgolette doppie vs singole


172

Sono veramente nuovo a Ruby e sto cercando di capire se c'è un momento specifico in cui dovrei usare ""vs ''.

Ho usato le virgolette singole per la maggior parte del tempo perché è più facile da scrivere ma non sono sicuro che dovrei.

ad es. get 'user/new'vsget "user/new"


12
Sei sicuro che si tratti di una domanda RoR e non solo di una domanda su Ruby?
Ignacio Vazquez-Abrams,

Esiste una guida di stile pertinente per scegliere quando non è necessaria l'interpolazione di stringhe?
William Entriken,

Risposte:


202

" " consente di eseguire l'interpolazione di stringhe, ad esempio:

world_type = 'Mars'
"Hello #{world_type}"

1
Quindi, in pratica, usa sempre virgolette doppie, giusto?
Nekonari,

8
No - le doppie virgolette consentono semplicemente l'interpolazione di stringhe. Se non si desidera l'interpolazione di stringhe, non utilizzare virgolette doppie.
Panh,

4
Non c'è motivo di usare le virgolette doppie solo quando è necessaria l'interpolazione, non c'è un impatto significativo sulle prestazioni e ti farà solo pensare a ciò che devi usare. Usa solo stringhe tra virgolette.
Matheus,

137

fatta eccezione per l'interpolazione, un'altra differenza è che la "sequenza di escape" non funziona con una virgoletta singola

puts 'a\nb' # just print a\nb 
puts "a\nb" # print a, then b at newline 

42
Fatta eccezione per la fuga di virgolette singole stesse, ad es 'don\'t'.
Sparhawk,

3
Questa è una risposta molto utile a questa domanda. Non mi sono mai reso conto che la virgoletta singola servisse a stampare letteralmente tutto tra virgolette singole, ad eccezione delle virgolette che devono essere sfuggite. Grazie.
Jay Godse,

6
E anche la barra rovesciata prova puts '\\'a stampare solo una singola barra. vedi qui stackoverflow.com/questions/25499046/...
Hardik

Sì, sono gli unici due casi in cui puoi scappare con virgolette singole
Alexis,

@Alex non è sicuro, forse una piccola differenza nelle prestazioni
lfx_cool

40

Per rispondere alla tua domanda, devi usare ""quando vuoi fare l'interpolazione di stringhe:

a = 2
puts "#{a}"

Utilizzare altrimenti semplici virgolette.

Inoltre, se ti stai chiedendo se c'è una differenza in termini di prestazioni, c'è una domanda eccellente su StackOverflow.

E se sei davvero nuovo di RoR, ti esorto a prendere un discreto libro di Ruby per imparare le basi della lingua. Ti aiuterà a capire cosa stai facendo (e ti impedirà di pensare che Rails sia magico). Consiglio personalmente The Well grounded Rubyist .


34

C'è una differenza tra ''virgolette singole e doppie ""in Ruby in termini di ciò che deve essere valutato in una stringa.

Inizialmente, vorrei chiarire che nella forma letterale di una stringa qualsiasi cosa tra virgolette singole o doppie viene valutata come un oggetto stringa, che è un'istanza della classe Ruby String.

Pertanto, 'stackoverflow'ed "stackoverflow"entrambi valuteranno le istanze della classe String senza alcuna differenza .

La differenza

La differenza essenziale tra le due forme letterali di stringhe (virgolette singole o doppie) è che le virgolette doppie consentono sequenze di escape mentre le virgolette singole no!

Una stringa letterale creata da virgolette singole non supporta l'interpollazione di stringhe e non sfugge alle sequenze.

Un esempio chiaro è:

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

mentre

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

L'interpolazione con virgolette singole non funziona affatto:

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

La migliore pratica

Poiché la maggior parte dei rubini Ruby suggerisce di usare letterali a virgoletta singola per le tue stringhe e scegli quelli doppi in caso di interpolazioni / sequenze di escape.


1
Quindi se avessi a = '\ n' e b = "# {a}", b verrebbe interpretato come una nuova riga o come sequenza di escape?
NathanTempelman,

4
Nel momento in cui assegni a = '\ n' a viene interpretato come "\\ n" interpollando da a a b non otterrai una nuova riga. b verrà valutato su "\\ n" (nessuna nuova riga si ottiene la sequenza di escape). a = '\ n' => "\\ n" dove come = = \ n "=>" \ n "
aloucas

6

Le stringhe a virgoletta singola non elaborano i codici di escape ASCII (\ n, \ t ecc.) E non eseguono l'interpolazione di stringhe mentre le virgolette doppie fanno entrambe le cose.

Esempio di codice di escape:

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

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

Esempio di interpolazione:

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

4

Simile alla risposta "\ n" nella stampa, di seguito è riportato un altro caso della differenza

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

quindi sembra che * sia stato convertito in carattere di escape tra virgolette doppie, ma non tra virgolette singole. A proposito, avrà un impatto sull'output quando si usa in un'espressione regolare, ad es. Str.gsub (/ espressione regolare /, '\ 1, \ 2')


2

Un altro motivo per cui si desidera utilizzare le virgolette singole è quando si passa uno schema regex come stringa:

Questo modello regex funzionerà perché passato tra virgolette singole:

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

Questo schema regex fallirà perché passato tra virgolette (dovresti fare doppio escape per farlo funzionare):

"123 ABC".match("\d")
=> nil

-8

In questo caso specifico, non fa differenza il modo in cui lo scrivi. Sono equivalenti. Inoltre, potresti voler leggere alcune altre guide / tutorial su Ruby :)


4
Non sono equivalenti, poiché le doppie virgolette consentono l'interpretazione delle stringhe.
Jason Noble,

7
Hai letto la parte "In questo caso specifico", prima di fare quell'osservazione estremamente intelligente?
Geo,

9
Sì, ma la sua domanda era quando usare virgolette singole o doppie.
Jason Noble il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.