Ruby singole e doppie virgolette

Recentemente ho fatto il codice in Ruby e sono venuto da Python, dove le virgolette singole e doppie non hanno fatto alcuna differenza sul modo in cui il codice ha funzionato per quanto ne so.

Mi sono trasferito su Ruby per vedere come funzionava e per indagare sulle somiglianze tra Ruby e Python.

Stavo usando le stringhe tra virgolette singole una volta e ho notato questo:

hello = 'hello' x = '#{hello} world!' puts x 

Ha restituito '#{hello} world!' piuttosto che 'hello world!' .

Dopo aver notato questo ho provato le virgolette doppie e il problema è stato risolto. Ora non sono sicuro del perché sia ​​così.

Le virgolette singole e doppie cambiano questo o è dovuto al mio editor (Testo sublime 3)? Sto anche usando la versione 2.0 di Ruby se funziona diversamente nelle versioni precedenti.

In Ruby, le virgolette sono interpolate, il che significa che il codice in #{} viene valutato come Ruby. Le virgolette singole vengono trattate come letterali (ovvero il codice non viene valutato).

 var = "hello" "#{var} world" #=> "hello world" '#{var} world' #=> "#{var} world" 

Per alcune magie extra-speciali, Ruby offre anche un altro modo per creare stringhe:

 %Q() # behaves like double quotes %q() # behaves like single quotes 

Per esempio:

 %Q(#{var} world) #=> "hello world" %q(#{var} world) #=> "#{var} world" 

Se si racchiude la stringa Ruby in singoli qout, non è ansible utilizzare l’interpolazione. È così che funziona Ruby.

Le stringhe con quotatura singola non elaborano la sequenza di escape \ e non eseguono l’interpolazione delle stringhe. Per una migliore comprensione, dare un’occhiata alla concatenazione delle stringhe e all’interpolazione

Per rispondere alla tua domanda, devi usare "" quando vuoi eseguire l’interpolazione delle stringhe:

 name = 'world' puts "Hello #{name}" # => "Hello world" 

Usando la sequenza di escape:

 puts 'Hello\nworld' # => "Hello\nworld" puts "Hello\nworld" # => "Hello world" 

Dovresti leggere la sezione Literals della documentazione ufficiale di Ruby.

È molto conciso, quindi è necessario leggere attentamente. Ma spiega la differenza tra stringhe tra virgolette e virgolette singole e come sono equivalenti a %Q/.../ e %q/.../ rispettivamente.

Ruby supporta una stringa con quotatura singola, per molti usi come segue:

 >> 'foo' => "foo" >> 'foo' + 'bar' => "foobar" 

Nell’esempio sopra, questi due tipi di stringhe sono identici. Possiamo usare il doppio preventivo al posto del preventivo singolo e otterremo lo stesso risultato come sopra l’esempio.

Quando si incontra un problema, mentre si utilizza l’interpolazione nella stringa con quotatura singola, perché Ruby non interpola in una stringa con quotatura singola. Sto prendendo un esempio per una maggiore comprensione:

 >> '#{foo} bar' => "\#{foo} bar" 

Qui puoi vedere i valori restituiti usando stringhe a virgolette doppie, che richiedono il backslash per sfuggire a caratteri speciali come #.

Una singola stringa tra virgolette è spesso utile perché è veramente letterale.

Nel concetto di interpolazione delle stringhe, la differenza essenziale tra l’uso di virgolette singole o doppie è che le virgolette doppie consentono sequenze di escape mentre le virgolette singole non lo fanno.

Facciamo un esempio:

 name = "Mike" puts "Hello #{name} \n How are you?" 

Il suddetto codice ruby con interpolazione di stringa interpola la variabile denominata name che è scritta all’interno di parentesi con il suo valore originale che è Mike . E stamperà anche la stringa Come stai? in una riga separata poiché abbiamo già inserito una sequenza di escape lì.

Produzione:

 Hello Mike How are you? 

Se fai lo stesso con le virgolette singole, tratterà l’intera stringa come un testo e stamperà così com’è anche la sequenza di escape.

 name = Mike' puts 'Hello #{name} \n How are you'? 

Produzione:

 Hello #{name} \n How are you?