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?

È stato utile?

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:

     

http://rors.org/2008/10/26 / dont-fuga-in-stringhe

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" %>

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top