Barre rovesciate in stringhe tra virgolette singole e stringhe tra virgolette doppie
Domanda
Se aggiungo una barra rovesciata + spazio all'inizio di stringhe tra virgolette doppie e singole, ottengo risultati diversi:
"\ text"
'\ text'
Nell'output della stringa tra virgolette doppie vedo solo uno spazio.
Nell'output per la singola stringa tra virgolette vedo barra rovesciata + spazio.
Cosa sta succedendo lì? Questo perché '\ '
viene interpretato come un carattere speciale nella stringa di virgolette doppie ma nella stringa di virgolette singole i caratteri vengono conservati così come sono?
Se cambio le stringhe in questo, vedo lo stesso output, ovvero una singola barra seguita da uno spazio e quindi il testo:
"\\ text"
'\\ text'
In entrambi i casi la barra rovesciata è sfuggita. Sono confuso perché lavorano allo stesso modo in questa situazione.
C'è qualche regola che potrebbe aiutare a spiegare la differenza fondamentale tra il modo in cui le stringhe tra virgolette singole e le stringhe tra virgolette doppie gestiscono le barre rovesciate in Ruby?
Soluzione
Ti rimando a " Ruby Programming / Strings <> quot!; per una panoramica molto concisa ma completa delle differenze.
Dal riferimento:
puts "Betty's pie shop"
puts 'Betty\'s pie shop'
Perché " Betty's " contiene un apostrofo, che ha lo stesso carattere della virgoletta singola, nella seconda riga dobbiamo usare una barra rovesciata per sfuggire all'apostrofo in modo che Ruby capisca che l'apostrofo è nella stringa letterale invece di segnare la fine della stringa letterale. La barra rovesciata seguita dalla virgoletta singola si chiama sequenza di escape.
Altri suggerimenti
Le stringhe tra virgolette supportano l'intera gamma di sequenze di escape, come mostrato di seguito:
-
\a
Campana / avviso (0x07) -
\b
Backspace (0x08) -
\e
Escape (0x1b) -
\f
Formford (0x0c) -
\n
Newline (0x0a) -
\r
Return (0x0d) -
\s
Spazio (0x20) -
\t
Scheda (0x09) -
\v
Scheda verticale (0x0b)
Per le stringhe a virgoletta singola, due barre rovesciate consecutive vengono sostituite da una barra rovesciata singola e una barra rovesciata seguita da una virgoletta singola diventa una virgoletta singola:
'escape using "\\"' -> escape using "\"
'That\'s right' -> That's right
Ruby interpreta solo le sequenze di escape in stringhe tra virgolette doppie. In una singola stringa tra virgolette, solo \\
(barra rovesciata) e \'
(citazione barra rovesciata) vengono considerati come caratteri speciali. Utilizzare stringhe tra virgolette doppie solo quando è necessaria una maggiore interpretazione. Altrimenti, le virgolette singole forniscono un aumento delle prestazioni.
Quando hai menzionato includendo il nome di una variabile, Ruby non lo fa mai. Solo il nome della variabile viene trattato come più letterale della stringa. Per includere il valore di una variabile (o qualsiasi espressione) inserisci l'espressione in questo modo:
"#{variable}"
Nota che funziona solo con stringhe tra virgolette doppie. Per aggiungere una variabile a una singola virgoletta, devi fare questo:
'The value of X is: '+X
Se hai bisogno di una formattazione seria, guarda la versione di Ruby di sprintf e printf. Sono praticamente avvolgenti attorno alle funzioni C e sono piuttosto potenti, ma un po 'ingombranti da usare.
Questa non è una risposta completa (poiché alla semplice domanda è già stata data una risposta), ma piuttosto si tratta di informazioni supplementari.
Quale stile di citazione di stringhe Ruby preferisci?
Non usare virgolette se necessario sfuggirli. E non cadere in & Quot; single vs virgolette " trappola. Ha Ruby ottimo supporto per arbitrari delimitatori per valori letterali di stringa:
Ho seguito quel consiglio e non ho mai guardato indietro!
È perché '\' è interpretato come un personaggio speciale in la stringa di virgolette doppie ma in stringa tra virgolette singole i caratteri sono preservati come sono?
Sì. Le stringhe a virgoletta singola vengono trattate come valori letterali; le stringhe tra virgolette vengono interpolate. È lo stesso in altre lingue simili a Ruby e non è cambiato in 1.9.
puoi creare <%= f.label :nom_entreprise, "Nom de l'entreprise" %>