Introduzione
A string is a sequence of one or more characters that may consist of letters, numbers, or symbols.
Le stringhe in Ruby sono oggetti e, a differenza di altri linguaggi, le stringhe sono mutabili, il che significa che possono essere modificate direttamente anziché creare nuove stringhe.
Utilizzerai le stringhe in quasi ogni programma che scrivi. Le stringhe ti permettono di visualizzare e comunicare con gli utenti utilizzando il testo. Infatti, la pagina che stai leggendo in questo momento è composta da stringhe visualizzate sullo schermo attraverso il tuo browser web. Le stringhe sono uno dei fondamenti più importanti della programmazione.
In questo tutorial, imparerai come lavorare con le stringhe in Ruby. Creerai stringhe, le visualizzerai sullo schermo, le memorizzerai in variabili, unirai più stringhe insieme e imparerai come gestire caratteri speciali come le nuove righe, gli apostrofi e le virgolette doppie.
Creazione e Stampa di Stringhe
Le stringhe esistono all’interno di virgolette singole '
o virgolette doppie "
in Ruby, quindi per creare una stringa, racchiudi una sequenza di caratteri in una o nell’altra.
'This is a string in single quotes.'
"This is a string in double quotes."
Puoi scegliere di usare sia singoli apici che doppi apici. Nella maggior parte dei casi, non importa quale scegli, purché tu sia coerente. Tuttavia, utilizzando i doppi apici puoi eseguire l’interpolazione delle stringhe, di cui parlerai in questo tutorial.
Per visualizzare una stringa nel tuo programma, puoi utilizzare il metodo print
:
print "Let's print out this string."
Il metodo print
visualizza la stringa esattamente come è scritta.
Provalo. Crea un nuovo programma Ruby chiamato print.rb
utilizzando il tuo editor di testo e utilizza il metodo print
per stampare tre stringhe:
print 'This is the first string.'
print 'This is the second string.'
print 'This is the third string.'
Salva il file e esegui il programma:
- ruby print.rb
Vedrai il seguente output:
OutputThis is the first string.This is the second string.This is the third string.
Invece delle tre stringhe stampate su righe separate, tutte e tre le stringhe sono state stampate insieme su una sola riga. Il metodo print
stampa la stringa sullo schermo, ma se volessi ogni stringa su una propria riga, dovresti aggiungere tu stesso un carattere di ritorno a capo.
Se volessi tutte e tre le stringhe su righe separate, utilizza invece il metodo puts
. Modifica il tuo programma per utilizzare puts
al posto di print
:
puts 'This is the first string.'
puts 'This is the second string.'
puts 'This is the third string.'
Ora esegui di nuovo il programma e vedrai questo output:
OutputThis is the first string.
This is the second string.
This is the third string.
Il metodo puts
stampa la stringa specificata, ma aggiunge anche un carattere di nuova riga alla fine della stringa per te.
Memorizzazione di stringhe nelle variabili
Le variabili sono un riferimento nominato a un luogo nella memoria del computer. Utilizzi le variabili per memorizzare dati e recuperarli successivamente.
Per memorizzare una stringa in una variabile, definisci il nome della variabile e assegna il valore della stringa:
my_string = 'This is my string'
Successivamente, per recuperare il valore, utilizza il nome della variabile:
print my_string
Per testare questo tu stesso, crea il file string_variables.rb
nel tuo editor con il seguente comando:
- nano string_variables.rb
Quindi aggiungi il seguente codice:
my_name = "Sammy the Shark"
my_age = "none of your business"
puts my_name
puts my_age
Questo programma definisce due variabili: my_name
e my_age
. Ad ogni variabile è assegnata una stringa. Utilizziamo poi il metodo puts
per stampare ciascuna stringa su una propria riga.
Salva il file con CTRL + X
e y
, quindi esegui il programma:
- ruby string_variables.rb
Vedrai il seguente output:
OutputSammy the Shark
none of your business
Assegnando stringhe alle variabili, puoi evitare di digitare la stessa stringa più volte ogni volta che vuoi utilizzarla, rendendo più facile lavorare e manipolare le stringhe nei tuoi programmi.
Vediamo come unire le stringhe insieme per creare nuove stringhe.
Concatenazione di stringhe
La concatenazione significa unire due o più stringhe per creare una nuova stringa. Per concatenare, utilizziamo l’operatore di concatenazione, rappresentato dal simbolo +
. Il simbolo +
è anche l’operatore di addizione quando utilizzato con operazioni aritmetiche.
Ecco come concatenare le stringhe sammy
e shark
insieme:
"sammy" + "shark"
Questo produrrebbe il seguente output:
Outputsammyshark
La concatenazione unisce le stringhe alla fine, combinandole e producendo un nuovo valore di stringa. Se desideri avere uno spazio tra le parole sammy
e shark
, devi includere tale spazio in una delle stringhe, come segue:
"sammy " + "shark"
Ora, non scriverai davvero codice in questo modo in un programma, ma spesso dovrai mescolare stringhe e variabili insieme, ed è qui che entra in gioco la concatenazione.
Ecco un esempio:
color = "Blue"
print "My favorite color is " + color
Questo produrrebbe in output Il mio colore preferito è blu
. Nota che abbiamo lasciato uno spazio dopo la parola è
nella stringa in modo che l’output abbia uno spazio tra la stringa e il valore della variabile nell’output.
Puoi concatenare più stringhe in questo modo. Crea il file concatenation.rb
e aggiungi questo codice:
my_name = "Sammy the Shark"
my_age = "none of your business"
puts "My name is " + my_name + " and my age is " + my_age + "."
Questo programma definisce due variabili: my_name
e my_age
, ognuna con la propria stringa assegnata, proprio come hai fatto in precedenza. Ma questa volta, anziché stampare i valori, stiamo stampando una stringa che utilizza la concatenazione per stampare quei valori con un po’ più di contesto.
Quando esegui questo programma, vedrai il seguente output:
OutputMy name is Sammy the Shark and my age is none of your business.
In questo piccolo programma, hai utilizzato la concatenazione per inserire le variabili in questa stringa.
Quando si combinano due o più stringhe attraverso la concatenazione, si crea una nuova stringa che può essere utilizzata in tutto il programma, quindi potresti voler assegnare la stringa creata a una nuova variabile che potrai utilizzare in seguito:
my_name = "Sammy the Shark"
my_age = "none of your business"
# assegna la stringa concatenata a una variabile
output = "My name is " + my_name + " and my age is " + my_age + "."
# Stampa l'output.
puts output
In un piccolo programma come questo, l’utilizzo di una variabile extra output
è probabilmente superfluo. Ma in programmi più grandi, potresti voler creare una stringa utilizzando la concatenazione che verrà utilizzata in più punti. È anche una buona abitudine separare l’elaborazione dei dati come la concatenazione e l’aritmetica dall’output, poiché alla fine i programmi diventeranno più grandi e vorrai separare la logica e l’output in file o componenti separati per renderli più facili da gestire.
Assicurati di non utilizzare l’operatore +
tra due tipi di dati diversi. Ad esempio, non puoi concatenare stringhe e interi insieme.
Per vedere cosa succede, crea un nuovo programma chiamato strings_and_integers.rb
con il seguente contenuto:
my_name = "Sammy the Shark"
my_number = 27
print my_name + my_number
Questa volta abbiamo my_name
che contiene la stringa Sammy the Shark
e my_number
che contiene l’intero 27
. Sappiamo che 27
non è una stringa perché non è circondata da virgolette. Inoltre, non ha un punto decimale, quindi sappiamo che è un intero.
Se esegui il programma:
- ruby strings_and_ints.rb
Vedrai questo messaggio di errore:
Outputstrings_and_ints.rb:4:in `+': no implicit conversion of Integer into String (TypeError)
from strings_and_ints.rb:4:in `<main>'
L’errore no implicit conversion of Integer into String
significa che Ruby può solo concatenare una stringa alla stringa esistente.
Nella versione di Ruby 2.3 e precedenti, vedresti invece questo messaggio di errore:
strings_and_ints.rb:4:in `+': no implicit conversion of Fixnum into String (TypeError)
from strings_and_ints.rb:4:in `<main>'
La parola chiave Fixnum
era il tipo di dato dato agli interi nelle versioni precedenti di Ruby. È l’abbreviazione di Fixed Number. In Ruby 2.4, Fixnum
e il suo controparte, Bignum
, non esistono più e sono sostituiti con Integer
al loro posto.
Potremmo modificare il nostro programma e mettere il numero 27
tra virgolette ("27"
) in modo che sia dichiarato come stringa invece di un intero. Oppure possiamo convertire il numero in una stringa quando creiamo la stringa, come questo:
my_name = "Sammy the Shark"
my_number = 27
print my_name + my_number.to_s
Il metodo .to_s
converte l’intero in una stringa. Questo è un approccio migliore, poiché ci permette di mantenere il nostro numero come un intero nel nostro programma. Ne abbiamo bisogno solo come stringa quando lo stampiamo, ma potremmo volerlo come intero se dobbiamo usarlo in altre parti della logica del nostro programma.
Ridimensiona il programma e vedrai stampato sullo schermo Sammy the Shark27
.
Convertire i numeri in stringhe per la concatenazione è qualcosa che incontrerai frequentemente quando si tratta di codici postali, valute, numeri di telefono e altri dati numerici che desideri visualizzare sullo schermo insieme al testo.
Concatenare è potente, ma può essere complicato. Se accidentalmente ometti uno degli operatori +
, puoi ottenere un errore di sintassi. E se devi unire stringhe con variabili che contengono numeri, devi convertire le variabili in stringhe. Ruby fornisce un altro modo per inserire i valori delle variabili in una stringa, chiamato interpolarizzazione della stringa che affronta entrambi questi problemi.
Utilizzando l’interpolarizzazione della stringa
Quando si concatenano stringhe e variabili, l’output può essere difficile da leggere e debuggare. L’interpolarizzazione della stringa risolve questo problema consentendoti di incorporare espressioni in una stringa racchiusa tra virgolette doppie.
Invece di scrivere questo:
"My name is " + my_name + "!"
Puoi fare questo:
"My name is #{my_name}!"
Al posto di terminare la stringa e utilizzare l’operatore +
, racchiudi la variabile con la sintassi #{}
. Questa sintassi dice a Ruby di valutare l’espressione e inserirla nella stringa.
Provalo. Crea un nuovo programma chiamato interpolazione.rb
e aggiungi questo codice:
my_name = "Sammy the Shark"
my_age = "none of your business"
output = "My name is #{my_name} and my age is #{my_age}."
puts output
Questo è lo stesso programma che hai già scritto, ma questa volta stiamo usando l’interpolarizzazione della stringa per creare l’output.
L’interpolarizzazione della stringa ha un altro vantaggio: può convertire automaticamente i valori numerici in stringhe. Ricordi il tuo programma stringhe_e_interi.rb
? Apri nuovamente quel file nel tuo editor, ma cambia l’ultima riga in modo che assomigli a quanto segue:
my_name = "Sammy the Shark"
my_number = 27
# utilizzare l'interpolazione invece della concatenazione
print "My name is #{my_name} and my favorite number is #{my_number}."
Ruby convertirà automaticamente my_number
in una stringa e il tuo programma stamperà l’output seguente quando lo esegui:
OutputMy name is Sammy the Shark and my favorite number is 27.
L’interpolazione delle stringhe è potente e conveniente. È anche il metodo preferito per concatenare stringhe con variabili.
Letterali di stringhe e valori di stringhe
Nota che tutte le stringhe che hai creato sono racchiuse tra virgolette nel codice, ma l’output effettivo stampato non include le virgolette.
C’è una distinzione quando ci si riferisce a ciascuno di questi. Un letterale di stringa è la stringa come è scritta nel codice sorgente, comprese le virgolette. Un valore di stringa è ciò che si vede nell’output e non include virgolette.
Questo è un letterale di stringa:
"Sammy the Shark"
Il valore della stringa sarebbe Sammy the Shark
.
Nella maggior parte dei casi, non dovrai preoccuparti di questa differenza, a meno che tu non voglia usare caratteri speciali come virgolette o apostrofi nelle tue stringhe.
Escape di virgolette e apostrofi nelle stringhe
A causa del fatto che i segni di citazione vengono utilizzati per indicare le stringhe, dovrai fare un po’ di lavoro extra se vuoi includere apostrofi e virgolette nelle stringhe.
Se provi a utilizzare un apostrofo nel mezzo di una stringa tra virgolette singole, come segue:
'This isn't what I wanted.'
L’apostrofo in isn't
termina la stringa, come puoi vedere dall’evidenziazione strana in questo esempio. Di conseguenza, l’interprete Ruby cercherà di analizzare il resto della stringa prevista come codice e otterrai un errore.
Incontreresti la stessa situazione se utilizzassi virgolette doppie in una stringa racchiusa tra virgolette doppie:
"Sammy says, "Hello!""
In questo esempio, la virgoletta doppia di chiusura davanti a Hello
termina la stringa, e la virgoletta doppia dopo Hello!
crea una nuova stringa che non ha una virgoletta doppia corrispondente per terminarla, quindi Ruby visualizzerà un errore.
Per evitare questo problema, hai alcune opzioni. In primo luogo, puoi utilizzare la sintassi alternativa per la creazione di stringhe; se devi utilizzare virgolette doppie nella stringa, utilizza virgolette singole per definire la stringa, e viceversa. Potresti anche escapare le virgolette, oppure potresti utilizzare una diversa sintassi Ruby per definire le stringhe. Esaminiamo ogni approccio.
Opzione 1: Utilizzare la Sintassi Alternativa per le Stringhe
Il modo più semplice per aggirare questi problemi è racchiudere la tua stringa tra virgolette singole quando la tua stringa ha bisogno di includere virgolette doppie e racchiudere la tua stringa tra virgolette doppie quando la tua stringa ha bisogno di usare virgolette singole.
Invece di definire questa stringa con virgolette singole:
'This isn't what I wanted.'
Definiscila con virgolette doppie:
"This isn't what I wanted."
E invece di usare virgolette doppie per definire questa stringa:
"Sammy says, "Hello!""
Usa virgolette singole:
'Sammy says, "Hello!"'
Utilizzare la sintassi alternativa può aiutarti in alcune situazioni, ma non sempre funzionerà. Ad esempio, nessuno dei due approcci funzionerà per questa stringa:
"Sammy says, "I'm a happy shark!""
In questo esempio, la virgoletta doppia di chiusura davanti a I'm
crea problemi. Questo termina la prima stringa, e quindi Ruby incontra l’apostrofo in I'm
, che avvia una nuova stringa con il valore m a happy shark!""
. Ma questa nuova stringa non ha una virgoletta singola corrispondente per terminarla. E utilizzare virgolette singole per racchiudere la stringa introduce un problema simile:
'Sammy says, "I'm a happy shark!"'
Questa volta l’apostrofo in I'm
termina la stringa.
Utilizzare la sintassi alternativa può anche rendere il tuo codice inconsistente. Passare costantemente tra la sintassi delle stringhe può diventare confuso, possiamo escapare i caratteri per aggirare questo problema.
Opzione 2: Caratteri di Escapamento nelle Stringhe
Il carattere backslash (\
), spesso chiamato il carattere di escape nelle stringhe, impedirà a Ruby di interpretare il prossimo carattere nella stringa letteralmente.
Ecco la nostra stringa problematica, codificata tra virgolette doppie, con virgolette doppie all’interno:
"Sammy says, "I'm a happy shark!""
Crea un nuovo programma Ruby chiamato quoting.rb
e aggiungi questo codice al file:
print "Sammy says, "I'm a happy shark!""
Esegui il programma:
- ruby quoting.rb
E vedrai questo output:
Outputquoting.rb:1: syntax error, unexpected tCONSTANT, expecting end-of-input
print "Sammy says, "I'm a happy shark!""
^
Per correggere l’errore, usa il backslash di fronte alle virgolette doppie interne:
print "Sammy says, \"I'm a happy shark!\""
Poi esegui nuovamente il programma e vedrai l’output che ti aspettavi:
Sammy says, "I'm a happy shark!"
Nota che non è necessario eseguire l’escape dell’apostrofo in questo esempio, poiché non c’è conflitto. Devi solo fare l’escape delle virgolette che confonderanno Ruby.
Puoi evitare completamente di fare l’escape delle virgolette utilizzando una sintassi diversa per definire le stringhe.
Opzione 3: Utilizzo di una Sintassi Alternativa per le Stringhe
Fino ad ora hai usato le virgolette per definire i limiti delle tue stringhe. Puoi creare stringhe in Ruby utilizzando anche altri caratteri. Puoi definire il delimitatore, o il carattere che desideri utilizzare per racchiudere la tua stringa, specificandolo dopo un segno percentuale, in questo modo:
%$Sammy says, "I'm a happy shark!"$
Questa sintassi automaticamente eseguirà l’escape delle stringhe incorporate per te. La stringa effettiva appare così:
"Sammy says, \"I'm a happy shark!\""
Tuttavia, cambiare il delimitatore significa che devi fare l’escape del delimitatore se devi utilizzarlo. In questo caso, se dovessi utilizzare un simbolo del dollaro nella tua stringa, dovresti fare l’escape del simbolo del dollaro letterale nella stringa.
Per evitarlo, puoi anche utilizzare coppie di parentesi graffe, parentesi quadre o parentesi tonde come delimitatori. Le parentesi graffe sono le più comuni:
%{Sammy says, "I'm a happy shark!"}
Tutte queste forme supportano anche l’interpolazione di stringhe se ne hai bisogno.
droplets = 5
print %{Sammy says, "I just created #{droplets} droplets!"}
Vedrai anche %Q{}
e %q{}
utilizzati per definire stringhe nei programmi Ruby. La sintassi di %Q{}
funziona esattamente come le stringhe racchiuse tra virgolette doppie, il che significa che non è necessario eseguire l’escape delle virgolette doppie e sarà possibile utilizzare l’interpolazione delle stringhe:
droplets = 5
print %Q{Sammy says, "I just created #{droplets} droplets!"}
La sintassi di %q{}
funziona esattamente come le stringhe racchiuse tra virgolette singole:
%q{Sammy says, "I'm a happy shark!"}
Potresti vedere la sintassi %q
e %Q
utilizzata con parentesi o parentesi quadre in alcuni programmi invece di parentesi graffe.
Come puoi vedere, ci sono molti modi per creare stringhe in Ruby. Qualunque metodo tu scelga, sii coerente nel tuo codice. Troverai che i metodi %Q{}
e %{}
sono i più comuni.
Ora che sai come gestire i caratteri speciali, vediamo come gestire le stringhe lunghe e i caratteri di nuova riga.
Stringhe lunghe e caratteri di nuova riga
Ecco alcune volte in cui potresti voler inserire un carattere di nuova riga o di ritorno a capo nella tua stringa. Puoi utilizzare i caratteri di escape \n
o \r
per inserire una nuova riga nel codice:
output = "This is\na string\nwith newlines"
puts output
Questo programma produrrebbe questo output:
OutputThis is
a string
with newlines
Tecnicamente questo funziona per ottenere il nostro output su più linee. Tuttavia, scrivere una stringa molto lunga su una singola riga diventerà rapidamente molto difficile da leggere e lavorare. Ci sono alcune soluzioni.
Innanzitutto, puoi usare l’operatore di concatenazione per dividere la stringa su più linee:
output = "This is a\n" +
"longer string\n" +
"with newlines."
puts output
Questo semplicemente concatena tre stringhe insieme, simile a ciò che hai già fatto.
Puoi anche inserire direttamente gli a capo nella stringa:
output = "This is a
longer string
with newlines"
puts output
Puoi anche utilizzare una delle sintassi di stringa alternative per creare stringhe multilinea:
output = %{This is a
longer string
with newlines}
puts output
In entrambi questi esempi, nota che non abbiamo bisogno dei caratteri di nuova riga ( \n
). Questo approccio preserva gli spazi vuoti, inclusa l’indentazione e le nuove righe.
Di conseguenza, l’output conterrà le interruzioni di riga, così come tutta l’indentazione iniziale, come questo:
OutputThis is a
longer string
with newlines
Per evitarlo, rimuovi gli spazi vuoti extra dal tuo codice:
output = %{This is a
longer string
with newlines
}
Puoi anche creare stringhe multilinea utilizzando un heredoc, o “documento qui”, un termine usato per le stringhe letterali multilinea nei programmi. Ecco come scriveresti quel codice:
output = <<-END
This is a
longer string
with newlines
END
I marcatori <<-END
e END
indicano l’inizio e la fine dell’heredoc.
Heredocs in Ruby conservano anche i caratteri di spaziatura, il che significa che se si indenta il codice nel heredoc, anche l’indentazione iniziale viene conservata. Quindi questo codice:
output = <<-END
This is a
longer string
with newlines
END
stamperà con due spazi di indentazione.
Ruby 2.3 e versioni successive forniscono la sintassi del “squiggly heredoc” che rimuove automaticamente questo spazio vuoto iniziale. Sostituisci il trattino nella definizione del heredoc con una tilde, quindi <<-
diventa <<~
, così:
output = <<~END
This is a
longer string
with newlines
and the code is indented
but the output is not.
END
Questo produce l’output seguente:
OutputThis is a
longer string
with newlines
and the code is indented
but the output is not.
Questo ti consente di utilizzare heredocs e mantenere il tuo codice ben indentato.
I heredocs in Ruby supportano anche l’interpolazione delle stringhe.
Come puoi vedere, ci sono molti modi per gestire le nuove righe e le stringhe multilinea in Ruby. Incontri tutti questi metodi mentre lavori con il codice Ruby esistente, poiché ogni progetto tende ad avere il proprio stile. Nel tuo codice personale, scegli lo stile che fa per te e sii coerente.
Replicazione delle Stringhe
Alcune volte potresti dover utilizzare Ruby per ripetere una stringa di caratteri diverse volte. Puoi farlo con l’operatore *
. Come l’operatore +
, l’operatore *
ha un uso diverso quando usato con numeri, dove è l’operatore per la moltiplicazione. Quando usato con una stringa e un numero intero, *
è l’operatore di replicazione delle stringhe, ripetendo una singola stringa quante volte desideri usando il numero intero che fornisci.
Per stampare Sammy
nove volte, useresti il seguente codice:
print "Sammy" * 9
Questo codice produce l’output seguente:
OutputSammySammySammySammySammySammySammySammySammy
Puoi usare questo per creare dell’arte ASCII interessante. Crea un file chiamato banner.rb
e aggiungi il seguente codice:
puts "=" * 15
puts "| Hello World |"
puts "=" * 15
Riesci a immaginare cosa produrrà il programma prima di eseguirlo?
Produce questo output:
Output===============
| Hello World |
===============
Questo è solo un piccolo esempio di come puoi far eseguire al computer compiti ripetitivi per te.
Conclusione
In questo tutorial, hai imparato come lavorare con il tipo di dato stringa nel linguaggio di programmazione Ruby. Hai creato nuove stringhe, le hai concatenate con altre stringhe e gestito ritorni a capo, virgolette e apostrofi. Poi hai usato l’interpolazione delle stringhe per rendere più semplice il mix di stringhe e valori delle variabili, e hai imparato come ripetere le stringhe.
Source:
https://www.digitalocean.com/community/tutorials/how-to-work-with-strings-in-ruby