Ruby Language
stringhe
Ricerca…
Sintassi
- 'Una stringa' // crea una stringa tramite letterale con quotatura singola
- "Una stringa" // crea una stringa tramite letterale a virgolette doppie
- String.new ("Una stringa")
- % q (A string) // sintassi alternativa per la creazione di stringhe con quotatura singola
- % Q (A string) // sintassi alternativa per la creazione di stringhe con doppie virgolette
Differenza tra valori letterali stringa a virgolette singole e virgolette
La differenza principale è che i letterali String
virgolette doppie supportano le interpolazioni di stringhe e il set completo di sequenze di escape.
Ad esempio, possono includere espressioni Ruby arbitrarie tramite interpolazione:
# Single-quoted strings don't support interpolation
puts 'Now is #{Time.now}'
# Now is #{Time.now}
# Double-quoted strings support interpolation
puts "Now is #{Time.now}"
# Now is 2016-07-21 12:43:04 +0200
Le stringhe con doppia citazione supportano anche l' intera serie di sequenze di escape, tra cui "\n"
, "\t"
...
puts 'Hello\nWorld'
# Hello\nWorld
puts "Hello\nWorld"
# Hello
# World
... mentre le stringhe a virgolette singole non supportano sequenze di escape, è utile il set minimo necessario per le stringhe con quotatura singola: virgolette singole letterali e barre rovesciate, rispettivamente '\''
e '\\'
.
Creare una stringa
Ruby offre diversi modi per creare un oggetto String
. Il modo più comune consiste nell'utilizzare virgolette singole o doppie per creare una " stringa letterale ":
s1 = 'Hello'
s2 = "Hello"
La differenza principale è che i letterali stringa con virgolette doppie sono un po 'più flessibili in quanto supportano l'interpolazione e alcune sequenze di escape backslash.
Ci sono anche molti altri modi possibili per creare una stringa letterale usando delimitatori di stringhe arbitrari. Un delimitatore di stringhe arbitrario è un %
seguito da una coppia di delimitatori corrispondente:
%(A string)
%{A string}
%<A string>
%|A string|
%!A string!
Infine, puoi usare la sequenza %q
e %Q
, che sono equivalenti a '
e "
":
puts %q(A string)
# A string
puts %q(Now is #{Time.now})
# Now is #{Time.now}
puts %Q(A string)
# A string
puts %Q(Now is #{Time.now})
# Now is 2016-07-21 12:47:45 +0200
%q
sequenze %q
e %Q
sono utili quando la stringa contiene virgolette singole, virgolette doppie o un mix di entrambi. In questo modo, non è necessario sfuggire al contenuto:
%Q(<a href="/profile">User's profile<a>)
Puoi utilizzare diversi delimitatori, purché vi sia una coppia corrispondente:
%q(A string)
%q{A string}
%q<A string>
%q|A string|
%q!A string!
Concatenazione di stringhe
Stringhe concatenate con l'operatore +
:
s1 = "Hello"
s2 = " "
s3 = "World"
puts s1 + s2 + s3
# => Hello World
s = s1 + s2 + s3
puts s
# => Hello World
O con l'operatore <<
:
s = 'Hello'
s << ' '
s << 'World'
puts s
# => Hello World
Si noti che l'operatore <<
modifica l'oggetto sul lato sinistro.
Puoi anche moltiplicare le stringhe, ad es
"wow" * 3
# => "wowwowwow"
Interpolazione a stringa
Il delimitatore a virgolette doppie "
e %Q
sequenza %Q
supporta l'interpolazione delle stringhe usando #{ruby_expression}
:
puts "Now is #{Time.now}"
# Now is Now is 2016-07-21 12:47:45 +0200
puts %Q(Now is #{Time.now})
# Now is Now is 2016-07-21 12:47:45 +0200
Manipolazione del caso
"string".upcase # => "STRING"
"STRING".downcase # => "string"
"String".swapcase # => "sTRING"
"string".capitalize # => "String"
Questi quattro metodi non modificano il ricevitore originale. Per esempio,
str = "Hello"
str.upcase # => "HELLO"
puts str # => "Hello"
Esistono quattro metodi simili che eseguono le stesse azioni ma modificano il ricevitore originale.
"string".upcase! # => "STRING"
"STRING".downcase! # => "string"
"String".swapcase! # => "sTRING"
"string".capitalize! # => "String"
Per esempio,
str = "Hello"
str.upcase! # => "HELLO"
puts str # => "HELLO"
Gli appunti:
- prima di Ruby 2.4 questi metodi non gestiscono unicode.
Divisione di una stringa
String#split
divide una String
in una Array
, in base a un delimitatore.
"alpha,beta".split(",")
# => ["alpha", "beta"]
Una String
vuota risulta in una Array
vuota:
"".split(",")
# => []
Un delimitatore non corrispondente risulta in una Array
contenente un singolo elemento:
"alpha,beta".split(".")
# => ["alpha,beta"]
Puoi anche dividere una stringa usando le espressioni regolari:
"alpha, beta,gamma".split(/, ?/)
# => ["alpha", "beta", "gamma"]
Il delimitatore è facoltativo, per impostazione predefinita una stringa viene divisa in spazi vuoti:
"alpha beta".split
# => ["alpha", "beta"]
Unione di stringhe
Array#join
unisce a una Array
in una String
, in base a un delimitatore:
["alpha", "beta"].join(",")
# => "alpha,beta"
Il delimitatore è facoltativo e il valore predefinito è una String
vuota.
["alpha", "beta"].join
# => "alphabeta"
Una Array
vuota risulta in una String
vuota, indipendentemente dal delimitatore utilizzato.
[].join(",")
# => ""
Stringhe multilinea
Il modo più semplice per creare una stringa multilinea è utilizzare semplicemente più righe tra virgolette:
address = "Four score and seven years ago our fathers brought forth on this
continent, a new nation, conceived in Liberty, and dedicated to the
proposition that all men are created equal."
Il problema principale di questa tecnica è che se la stringa include una citazione, interromperà la sintassi della stringa. Per ovviare al problema, puoi utilizzare invece un heredoc :
puts <<-RAVEN
Once upon a midnight dreary, while I pondered, weak and weary,
Over many a quaint and curious volume of forgotten lore—
While I nodded, nearly napping, suddenly there came a tapping,
As of some one gently rapping, rapping at my chamber door.
"'Tis some visitor," I muttered, "tapping at my chamber door—
Only this and nothing more."
RAVEN
Ruby supporta i documenti in stile shell qui con <<EOT
, ma il testo che chiude deve iniziare la riga. Ciò rovina il rientro del codice, quindi non c'è un motivo in più per usare questo stile. Sfortunatamente, la stringa avrà indentazioni a seconda di come il codice stesso sia rientrato.
Ruby 2.3 risolve il problema introducendo <<~
che rimuove gli spazi in eccesso:
def build_email(address)
return (<<~EMAIL)
TO: #{address}
To Whom It May Concern:
Please stop playing the bagpipes at sunrise!
Regards,
Your neighbor
EMAIL
end
Le stringhe percentuali funzionano anche per creare stringhe multilinea:
%q(
HAMLET Do you see yonder cloud that's almost in shape of a camel?
POLONIUS By the mass, and 'tis like a camel, indeed.
HAMLET Methinks it is like a weasel.
POLONIUS It is backed like a weasel.
HAMLET Or like a whale?
POLONIUS Very like a whale
)
Esistono alcuni modi per evitare l'interpolazione e le sequenze di escape:
Virgolette singole invece di virgolette doppie:
'\n is a carriage return.'
Minuscolo
q
in una stringa percentuale:%q[#{not-a-variable}]
Cita solo la stringa terminale in un heredoc:
<<-'CODE' puts 'Hello world!' CODE
Stringhe formattate
Ruby può iniettare una matrice di valori in una stringa sostituendo qualsiasi segnaposto con i valori dell'array fornito.
"Hello %s, my name is %s!" % ['World', 'br3nt']
# => Hello World, my name is br3nt!
I segnaposto sono rappresentati da due %s
e i valori sono forniti dall'array ['Hello', 'br3nt']
. L'operatore %
ordina alla stringa di iniettare i valori dell'array.
Sostituzioni di carattere stringa
Il metodo tr
restituisce una copia di una stringa in cui i caratteri del primo argomento sono sostituiti dai caratteri del secondo argomento.
"string".tr('r', 'l') # => "stling"
Per sostituire solo la prima occorrenza di un motivo con un'altra espressione, utilizzare il metodo sub
"string ring".sub('r', 'l') # => "stling ring"
Se si desidera sostituire tutte le occorrenze di un modello con tale espressione, utilizzare gsub
"string ring".gsub('r','l') # => "stling ling"
Per cancellare i caratteri, passa una stringa vuota per il secondo parametro
Puoi anche usare espressioni regolari in tutti questi metodi.
È importante notare che questi metodi restituiranno solo una nuova copia di una stringa e non modificheranno la stringa sul posto. Per farlo, devi usare il tr!
, sub!
e gsub!
metodi rispettivamente.
Capire i dati in una stringa
In Ruby, una stringa è solo una sequenza di byte insieme al nome di una codifica (come UTF-8
, US-ASCII
, ASCII-8BIT
) che specifica come interpretare quei byte come caratteri.
Le stringhe di Ruby possono essere utilizzate per contenere il testo (in pratica una sequenza di caratteri), nel qual caso viene utilizzata solitamente la codifica UTF-8.
"abc".bytes # => [97, 98, 99]
"abc".encoding.name # => "UTF-8"
Le stringhe di Ruby possono anche essere utilizzate per contenere dati binari (una sequenza di byte), nel qual caso viene utilizzata solitamente la codifica ASCII-8BIT.
[42].pack("i").encoding # => "ASCII-8BIT"
È possibile che la sequenza di byte in una stringa non corrisponda alla codifica, causando errori se si tenta di utilizzare la stringa.
"\xFF \xFF".valid_encoding? # => false
"\xFF \xFF".split(' ') # ArgumentError: invalid byte sequence in UTF-8
Sostituzione delle stringhe
p "This is %s" % "foo"
# => "This is foo"
p "%s %s %s" % ["foo", "bar", "baz"]
# => "foo bar baz"
p "%{foo} == %{foo}" % {:foo => "foo" }
# => "foo == foo"
Vedi String %
docs e Kernel :: sprintf per maggiori dettagli.
La stringa inizia con
Per scoprire se una stringa inizia con un pattern, il start_with?
il metodo è utile
str = "zebras are cool"
str.start_with?("zebras") => true
Puoi anche controllare la posizione del pattern con l' index
str = "zebras are cool"
str.index("zebras").zero? => true
La stringa finisce con
Per scoprire se una stringa termina con un pattern, end_with?
il metodo è utile
str = "I like pineapples"
str.end_with?("pineaaples") => false
Posizionamento delle stringhe
In Ruby, le stringhe possono essere giustificate a sinistra, giustificate a destra o centrate
Per la stringa di giustificazione a sinistra, utilizzare il metodo ljust
. Questo accetta due parametri, un numero intero che rappresenta il numero di caratteri della nuova stringa e una stringa, che rappresenta il modello da riempire.
Se il numero intero è maggiore della lunghezza della stringa originale, la nuova stringa verrà giustificata a sinistra con il parametro stringa opzionale che occupa lo spazio rimanente. Se il parametro stringa non viene fornito, la stringa verrà riempita di spazi.
str ="abcd"
str.ljust(4) => "abcd"
str.ljust(10) => "abcd "
Per giustificare a destra una stringa, utilizzare il metodo rjust
. Questo accetta due parametri, un numero intero che rappresenta il numero di caratteri della nuova stringa e una stringa, che rappresenta il modello da riempire.
Se il numero intero è maggiore della lunghezza della stringa originale, la nuova stringa sarà giustificata a destra con il parametro stringa opzionale che occupa lo spazio rimanente. Se il parametro stringa non viene fornito, la stringa verrà riempita di spazi.
str = "abcd"
str.rjust(4) => "abcd"
str.rjust(10) => " abcd"
Per centrare una corda, usa il metodo center
. Questo accetta due parametri, un numero intero che rappresenta la larghezza della nuova stringa e una stringa, con la quale verrà riempita la stringa originale. La stringa sarà allineata al centro.
str = "abcd"
str.center(4) => "abcd"
str.center(10) => " abcd "